[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

このブログの人気の投稿

コピーした行の挿入が表示されない時はフィルタされていないかチェック

Excel で一部の図形だけ固定する