1

2 つの日付の間のデータを表示する SQL ステートメントがあります。私はほとんどそれを手に入れましたが、問題があります。

入力March 1,2012 to March 7, 2012すると..2つの間の日付のデータが表示されます..しかし、2012年3月より下のすべての日付も表示されます..しかし、2012年3月10日から2012年3月30日を入力するたびに、SQLは完全に機能します..どんな助けでも高く評価されます。ありがとう

SELECT 
   agentname, noofcalls, qualified, booking, resched, 
   actualbooking, sales, remarks, 
   concat(month,' ',day,',',year) as 'date' 
FROM 
   tblagents
WHERE 
   (month between '" & cbosmonth.Text & "' AND '" & cboemonth.Text & "')
   AND (day between '" & cbosday.Text & "' AND '" & cboeday.Text & "')
   AND (year between '" & cbosyear.Text & "' AND '" & cboeyear.Text & "')"
4

3 に答える 3

3

あなたの「間」のそれぞれで文字列比較を行っています。1、2、または 3 で始まるすべての数字は、その後に続くもの (21、26、31 など) に関係なく、文字列として見るとすべて 7 未満です。1 から 30 は、31 だけを残しているため機能し、30 < 31 は文字列としても機能します。

最初に連結を行い、次にその間を行います。

WHERE concat(month,' ',day,',',year) 
      BETWEEN concat(cbosmonth.Text,' ', cbosday.Text,' ',cbosyear.Text)
      AND concat(cboemonth.Text,' ', cboeday.Text,' ',cboeyear.Text)

(正しい構文を確認してください。私はあなたの質問からコピーして貼り付けているだけで、試していません)

ところで、理由がない限り、おそらく日付全体を正しいデータ時刻 (datetime、timestamp、...) を持つ単一の列に格納し、3 つの列に分けて格納する必要はありません。

于 2012-12-14T09:35:59.287 に答える
0

これは、データベースに日付を格納する間違った方法です。日付列をデータ型dateに変更します。

次に、次のことができます。

SELECT *
FROM table
WHERE bookingDate between to_date ('2012/03/01', 'yyyy/mm/dd')
AND to_date ('2012/03/07', 'yyyy/mm/dd');
于 2012-12-14T09:44:48.030 に答える
0

このアプローチは間違っています。

日付が 2 つの間隔の日付の間にあるためには、2 つの日付の間に日番号が含まれている必要はありません。例: (疑似コード)

  • date = May-25-2012; startDate = March-15-2012, endDate = June-01-2012
  • dateは明らかに と の間にstartDateありますendDateが、まだ
  • day(date)は 25 で、 と の間ではありませday(startDate) = 15day(endDate) = 1
  • さらに、15 は 1 よりも大きいため、その間に数字がないため、条件は常に false になります。

日付の月の部分についても同様の例を作成できます (例: date = May-25-2012; startDate = September-15-2010, endDate = Match-01-2015)

日、月、年の値を取得し、アプリケーションまたはサーバーで日付を作成し、それを使用して値を比較する必要があります。


VB でテキスト フィールドから日付を作成するには

Dim startDate = new DateTime( 
      Convert.ToInt32(cbosyear.Text), 
      Convert.ToInt32(cbosmonth.Text), 
      Convert.ToInt32(cbosday.Text))

ユーザーが年の値として「some text」などを入力すると、これは失敗することに注意してください。それを実現するには、いくつかのデータ検証を追加する必要があります。

SQL Server のパーツから日時を作成するには、こちらをご覧ください。かなりの数のテクニックが説明されています。

また、値を単に SQL 文字列に貼り付けることは常に避ける必要があります。これは、SQL インジェクションの問題を引き起こします。次のようにする必要があります。

Dim command = new SqlCommand()
command.CommandText = "SELECT .... FROM tblagents where DATEFROMPARTS(year, month, day) between @startDate AND @endDate"
command.Parameters.AddWithValue("@startDate", startDate)
command.Parameters.AddWithValue("@endDate", endDate)
于 2012-12-14T09:45:57.420 に答える