[SQL] 日付条件の注意点
Transact-SQL のお話。
非常によくある要件に、現在日時から○ヶ月前のデータを取得する、一定の期間内のデータを取得する、だとかがある。
で、検索対象となるカラムが datetime で、日付を検索条件とする際には注意が必要だ。
例えば、二ヶ月前から現在のデータを取得するには……。
-- GETDATE() = 2013-03-01 20:12:13.583 SELECT * FROM Hoge WHERE PROCESS_DT between DATEADD(month, -2, GETDATE()) AND GETDATE()とやりがちで、データも取得できるので一見良さそうにみえる。
しかし、「2013-01-01 11:11:11.111」のレコードが取得できるだろうか?
これではできない。
時間も検索条件に入ってしまっているためだ。
なので、以下のように時間をリセットしなければならない。
DECLARE @dt DATETIME SET @dt = CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE(), 112)) SET @dt = DATEADD(month, -2, @dt)CONVERT
http://msdn.microsoft.com/ja-jp/library/ms187928.aspx - msdn
DATEADD
http://msdn.microsoft.com/ja-jp/library/ms186819.aspx - msdn
しかし、これでも完璧ではない。
二ヶ月前の同日を含めるためには、意図的に一日進めなければならない。
SET @dt = DATEADD(DAY, 1, @dt)この記事はいつまで経っても秀逸だ。
http://itpro.nikkeibp.co.jp/article/COLUMN/20060309/232077/ - ITPro