Select * from [User] U
where U.DateCreated = '2014-02-07'
しかし、データベースでは、ユーザーは2014-02-07 12:30:47.220
に作成され、私が'2014-02-07'
を入力したとき
データは表示されません
このようなことをしたくはありません。
Select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'
これはより良い方法です。
Select * from [User] U
where U.DateCreated >= '2014-02-07' and U.DateCreated < dateadd(day,1,'2014-02-07')
参照してください: Sargable (このページはウィキペディアから削除されました)
編集+ where句(または結合条件)でデータの関数を使用しないようにするには、2つの基本的な理由があります。
2014-02-07
のような単一の基準と比較することができるように、それはクエリに何百、何千または何百万もの計算を追加するかもしれません。代わりにデータに合うように基準を変更するほうがはるかに効率的です。「データに適合するように基準を修正する」は、「use SARGABLE
述部」を記述する私の方法です。
そして間にも使用しないでください。
日付と時刻の範囲のベストプラクティスはBETWEENを避け、常に次の形式を使用することです。
WHERE col> = '20120101' AND col <'20120201'この形式は、時間部分が適用可能かどうかにかかわらず、すべてのタイプとすべての精度で機能します。
http://sqlmag.com/t-sql/t-sql-best-practices-part-2 (Itzik Ben-Gan)
SQL Server 2008以降を使用している場合は、dateデータ型を使用できます。
SELECT *
FROM [User] U
WHERE CAST(U.DateCreated as DATE) = '2014-02-07'
日付列が索引付けされている場合、これは依然として索引を使用し、SARG可能であることに注意する必要があります。これは、日付と日時に関する特別な場合です。
SQL Serverが実際にこれを>句と<句に変換していることがわかります。
@ kobikのコメントに従ってdateカラムに二次インデックスを付けて大きなテーブルでこれを試してみましたが、インデックスはまだ使用されています。
SELECT *
FROM [User] U
WHERE CAST(U.DateCreated as DATE) = '2016-07-05'
あなたのクエリによるとSelect * from [User] U where U.DateCreated = '2014-02-07'
SQL Serverは正確な日付と時刻を比較しています。つまり、2014-02-07 12:30:47.220
と2014-02-07 00:00:00.000
を比較して同等にします。それが比較の結果が間違っている理由です
したがって、日付を比較しながら、時間も考慮する必要があります。あなたが使用することができますSelect * from [User] U where U.DateCreated BETWEEN '2014-02-07' AND '2014-02-08'
。
もちろんこれは古いスレッドですが、完全にするためのものです。
SQL 2008からはDATEデータ型を使用できるので、単純に次のことができます。
SELECT CONVERT(DATE,GETDATE())
OR
Select * from [User] U
where CONVERT(DATE,U.DateCreated) = '2014-02-07'