web-dev-qa-db-ja.com

SQL Serverでdatetimeとdateのみを比較する方法

Select * from [User] U
where  U.DateCreated = '2014-02-07'     

しかし、データベースでは、ユーザーは2014-02-07 12:30:47.220に作成され、私が'2014-02-07'を入力したとき

データは表示されません

65
Muhabutti

このようなことをしたくはありません。

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つの基本的な理由があります。

  1. ほとんどの場合、データに対する関数を使用してフィルタ処理または結合を行うと、オプティマイザがそのフィールドのインデックスにアクセスすることができなくなるため、クエリが遅くなります(または "コストがかかる")
  2. もう1つは、関与するデータのすべての行に対して、少なくとも1つの計算が実行されているということです。 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)

68
Used_By_Already

SQL Server 2008以降を使用している場合は、dateデータ型を使用できます。

SELECT *
FROM [User] U
WHERE CAST(U.DateCreated as DATE) = '2014-02-07'

日付列が索引付けされている場合、これは依然として索引を使用し、SARG可能であることに注意する必要があります。これは、日付と日時に関する特別な場合です。

enter image description here

SQL Serverが実際にこれを>句と<句に変換していることがわかります。

enter image description here

@ kobikのコメントに従ってdateカラムに二次インデックスを付けて大きなテーブルでこれを試してみましたが、インデックスはまだ使用されています。

SELECT *
FROM [User] U
WHERE CAST(U.DateCreated as DATE) = '2016-07-05'

showing index usage with secondary index

55
Steve Ford

あなたのクエリによるとSelect * from [User] U where U.DateCreated = '2014-02-07'

SQL Serverは正確な日付と時刻を比較しています。つまり、2014-02-07 12:30:47.2202014-02-07 00:00:00.000を比較して同等にします。それが比較の結果が間違っている理由です

したがって、日付を比較しながら、時間も考慮する必要があります。あなたが使用することができます
Select * from [User] U where U.DateCreated BETWEEN '2014-02-07' AND '2014-02-08'

2
imdzeeshan

もちろんこれは古いスレッドですが、完全にするためのものです。

SQL 2008からはDATEデータ型を使用できるので、単純に次のことができます。

SELECT CONVERT(DATE,GETDATE())

OR

Select * from [User] U
where  CONVERT(DATE,U.DateCreated) = '2014-02-07' 
0
Bikram