4

SQL Server 2005 でクエリを実行して、日付範囲内のレコードを検索しています。句は次のWHEREようになります。

WHERE (CONVERT(NVARCHAR, fldPublishedDate, 101) >= '" & toDate & 
   "' AND CONVERT(NVARCHAR, fldPublishedDate, 101) <= '" & fromDate & "')"

toDateとは、とfromDateのように入力されます。 04/01/200504/30/2005

私が得ている結果は、間違いなくすべて 4 月 1 日から 30 日の間ですが、2005 年 (データ収集が開始されたとき) から 2012 年までのさまざまな年のものです。比較から年が単に無視されているようです。ここで何か不足していますか?

これを読んでいただきありがとうございます。

4

3 に答える 3

6

なぜ文字列に変換するのですか?もちろん、これは期待どおりには機能しません。あなたが言っている:

IF '12/02/2010' > '09/12/2012'

もちろん、これは真になります。あなたは言うべきです:

WHERE fldPublishedDate >= '20050401'
  AND fldPublishedDate < DATEADD(DAY, 1, '20050430');

日付範囲のみを比較する場合のみ、列を日付に変換する必要はありません。最も重要なことは、地域や言語の設定に影響されない明確な形式で日付を渡す必要があることです (例: YYYYMMDD)。イギリスでは2012年4月6日は何月なのでしょうか? 101は安全なスタイルではありません。4月じゃなくて6月です。これらの日付を (従来の ASP?) コードでより適切にフォーマットするか、使用している言語から適切な日時データ型を渡す必要があると思います。最後に、長さのない NVARCHAR を使用しないでください。

于 2012-04-30T21:01:07.230 に答える
2

がSQLサーバーの日付である場合、比較を行うfldPublishedDateためにそれをaに変換するのはなぜですか。andを datetime にnvarchar変換して比較できますtoDatefromDate

declare @toDate nvarchar(50)
declare @fromDate nvarchar(50)

set @toDate  = '04/01/2005'
set @fromDate  = '04/30/2005'

select cast(@toDate as datetime), cast(@fromDate as datetime)

results:
ToDate                      FromDate
2005-04-01 00:00:00.000     2005-04-30 00:00:00.000

次に、WHERE句で:

WHERE fldPublishedDate >= cast(@toDate as datetime)
 AND fldPublishedDate <= cast(@fromDate as datetime)
于 2012-04-30T21:06:33.640 に答える
2

fldPublishedDateでありdatetime、 のみを比較したいとしますdate

SQL 2008 では、便利な日付型を使用します。

WHERE CONVERT(date, fldPublishedDate) >= CONVERT(date, '" & toDate & 
"' AND CONVERT(date, fldPublishedDate) <= CONVERT(date, '" & fromDate & "'"

< SQL 2008 では、クレイジーな構文を使用できます。

WHERE DATEADD(dd, DATEDIFF(dd, 0, fldPublishedDate), 0) >= CONVERT(datetime, '" & toDate & 
"' AND DATEADD(dd, DATEDIFF(dd, 0, fldPublishedDate), 0) <= CONVERT(datetime, '" & fromDate & "'"

技術的には、SQL がdatetime文字列を変換するので、値の変換を省略できます。

また、SQL インジェクションとパラメーターについても読む必要があります。書きやすく、読みやすく、安全でもあります。勝つ、勝つ、勝つ。

于 2012-04-30T21:08:06.570 に答える