SQL Serverには、時間要素を含むDATETIME
列があります。
例
'14 AUG 2008 14:23:019'
時間の部分を無視して、特定の日のレコードだけを選択する最良の方法は何ですか?
例を挙げます。 (時間の部分にマッチせず、行を返さないので安全ではありません)
DECLARE @p_date DATETIME
SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )
SELECT *
FROM table1
WHERE column_datetime = @p_date
*MSSQLのDATETIME関連は、私がSQLBOLで最も調べているトピックでもあるので、この質問に対する私なりの回答を掲載します。
Update 例をより具体的にしました。
編集 申し訳ありませんが、間違った回答(間違った結果を返す回答)を修正しなければなりませんでした。
@Jorrit: WHERE (date>'20080813' AND date<'20080815')
は、13日と14日を返します。
@wearejimbo:*惜しかったですが、葉巻はもらえませんでしたね。2008年8月14日23:59:001~23:59:999(午前0時1秒前)の記録を見逃しています。
テクニック1:
DECLARE @p_date DATETIME
SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )
SELECT *
FROM table1
WHERE column_datetime >= @p_date
AND column_datetime < DATEADD(d, 1, @p_date)
この方法の利点は、 'column_datetime'にインデックスが存在する場合、それを使用することです。
テクニック2:
DECLARE @p_date DATETIME
SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )
SELECT *
FROM table1
WHERE DATEDIFF( d, column_datetime, @p_date ) = 0
column_datetimeフィールドがインデックスされておらず、される可能性も低い(あるいはインデックスが使われる可能性も低い)場合は、DATEDIFF()を使う方が短いです。
SELECT *
FROM table1
WHERE CONVERT(varchar(10),columnDatetime,121) =
CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121)
これは、datatimeとstringを"YYYY-MM-DD"というフォーマットのvarcharsに変換します。
これは非常に醜いですが、動作するはずです。