web-dev-qa-db-ja.com

where句のSQL日付の違い

私は次のようにクエリを実行しています:

SELECT
  *
FROM a
WHERE DATEDIFF(D, a.DateValue, DateTimeNow) < 3;

動作していない

3日以内のデータを取得しようとしています。

SQLサーバー。

これを行う方法?

DATEDIFFの動作が遅すぎます。

12
DarthVader

DateDiffは非常に高速です...問題は、データベーステーブルの列の値で実行しているため、この列にインデックスがあったとしても、クエリプロセッサはテーブルのすべての行で関数を実行する必要があります。 。これは、テーブル全体をディスクからロードする必要があることを意味します。

代わりに、今日の日付でdateAdd関数を使用し、データベーステーブルの列をその単一の計算の結果と比較します。現在はDateAdd()を1回だけ実行し、インデックス(存在する場合)を使用して、述語基準に一致する行のみをロードできます。

Where a.DateValue > DateAdd(day,-3,getdate())

この方法でこれを行うと、クエリ述語が作成されます SARG-able

28
Charles Bretana

http://msdn.Microsoft.com/en-us/library/aa258269%28v=sql.80%29.aspx にあるMicrosoftのドキュメントでは、DateTimeNowの代わりにgetdate()。そのようにうまく機能しますか?

1

あなたの質問は悪くないようです。それに取り組む別の方法は次のとおりです。

SELECT * FROM a WHERE a.DateValue > DATEADD(dd,-3,GETDATE())
0
cairnz