2012-03-09 13 views
1

SQL Serverテーブルでは、タイムスタンプという名前のフィールドがあります。これは 'datetime'フィールドです。私が作成した画面では、ユーザーは日付(時間なし)を渡し、その日付のすべてのレコードを返す必要があります。SQL - 日付パラメータと日付との比較

フィールド内の時刻が00:00:00以外の場合、Timestamp = @Dateは機能していないようです。これを行う最も効率的な方法は何ですか?

+0

タイムスタンプなしで日付を比較するとよいでしょう。そうでなければ..結果を得る方法? –

答えて

6

SQL Server 2008を使用しているので、DATEデータ型を使用できます。時間がない部分 -

は日付だけで仕事となります

CAST(Timestamp AS DATE) = @Date 

との比較を行います。

2

通常、特定の日付のデータは、ある特定の時点ではなく、範囲内のデータと考えるべきです。だから、理想的なクエリのような、範囲を使用する必要があります。この場合

WHERE [Timestamp] >= @Date 
AND [Timestamp] < DATEADD(DAY, 1, @Date) 

、幸いにも、オプティマイザは、スマートであり、あなたが列に対してCONVERT(DATE, [timestamp])を使用する場合は、まだインデックスを使用します。しかし、多くの場合、これはあなたの条項をしばしば非sargableにするので注意する必要があります。

PS Timestampはひどい列名です。 SQL Serverのデータ型で、日付または時刻とは関係ありません。

0

時間の値を切り捨てる一般的な方法は、DATEDIFFDATEADDの関数を使用することです。あなたの例では、このようにタイムスタンプフィールドの時間部分を切り捨てるために使用されます。

WHERE @DateEntered = DATEADD(DAY,0, DATEDIFF(DAY, 0, Timestamp)) 

Basciallyそれは日時の値を取り、(より良い説明の不足のために)「0で表される日付」からの日数の名前を検索し、次にその日数をバック追加しています。これにより、効果的に時間部分が切り捨てられます。

関連する問題