Pages

2013/03/27

[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
Related Posts Plugin for WordPress, Blogger...