-2

私の問題は、おそらく日付の書式設定に関するものSELECTです。

asp ファイルで ADO レコードセットを開き、 と の間にある MS SQL テーブルの行を取得しますdate1 (08/15/2013)(date2 (08/22/2013)つまり、今日の日付から過去 7 日間)。

SELECT適切な 2013 行を取得しますが、2012 年 8 月 15 日までさかのぼる行も取得します。

選択は次のとおりです。

oRS.Source = "SELECT * FROM aTable WHERE entry_Date BETWEEN '" & resultLowerDate & "' AND '" & resultCurrentDate & "' AND entry_Status <> 'INACTIVE'"

resultLowerDate = 08/15/2013 および resultCurrentDate = 08/22/2013.

テーブルは、resultCurrentDate = "08/22/2013" で次のように設定されます。

entry_Status    entry_Date (varchar)    LastName    FirstName   SELECT Result
INITIAL     08/15/2012      Smith       Jim         YES
INACTIVE    08/21/2012      Green       Tom         no
INITIAL     08/22/2013      Jones       Mary            yes
FOLLOWUP    08/22/2013      Jones       Mary            yes
FOLLOWUP    08/22/2013      Brown       Sally           yes
FOLLOWUP    08/22/2013      Smith       Jim         yes

クエリINITIAL 08/15/2012を満たす他の行と一緒に行が選択される理由について何か考えはありますか?SELECT

4

2 に答える 2

3

VARCHAR 列に日付を格納するのはやめましょう! 文字列の連結をやめて、適切なパラメータを使用してください。

大声で申し訳ありませんが、人々が何らかの未知のおそらくばかげた理由で間違ったデータ型を使用しているという質問が 1 日に複数寄せられており、これらはそれが引き起こす問題です。

ここでの問題は、文字列を比較していることです。試す:

"... WHERE CONVERT(DATETIME, entry_date, 101)" & _
     " >= CONVERT(DATETIME, '" & resultLowerDate & "', 101)" & _
" AND CONVERT(DATETIME, entry_date, 101)" & _
     " < DATEADD(DAY, 1, CONVERT(DATETIME, '" & resultCurrentDate & "', 101))"

または、resultLowerDate と resultUpperDate を YYYYMMDD 形式に設定すると、次のように言えます。

"... WHERE CONVERT(DATETIME, entry_date, 101) >= '" & resultLowerDate & "'" & _
" AND CONVERT(DATETIME, entry_date, 101) < DATEADD(DAY, 1, '" & resultCurrentDate & "'"

VARCHAR 列にタイムスリップした場合に備えて、BETWEEN の代わりに無制限の範囲 (>= と <) を使用していることに注意してください。

また、ガベージが列に入ったために、このクエリが失敗する可能性があることにも注意してください。間違ったデータ型を選択したため、可能です。私の本当の提案は、テーブルを修正してDATEまたはDATETIME列を使用することです。

于 2013-08-22T15:31:26.870 に答える