SQL Server where句に日付を使ったselect
今回は、 convert(varchar(10),getdate()-1,111) を紹介したいと思います。
これは、昨日の0:00:00.000を表します。
これが便利なのは、例えば、昨日のデータだけを抽出したい、というときです。
datetimeデータ型の列をselectする場合など、日付の扱いは注意が必要です。
それは、データが「日付+時刻」だからです。
例えば、ORDERDATE が 2009-08-10 のデータをselectする場合、
select * from ORDERDATE='2009-08-10'
とやってしまうと正しいデータが取得できない場合があります。
実際のデータをよく見てみると、
2009-08-10 00:00:00.000
2009-08-10 01:00:00.000
2009-08-10 23:59:59.997
2009-08-11 00:00:00.000
2009-08-11 01:00:00.000
と時間が丁寧に入っていたりするからです。
最初のクエリを実行すると「2009-08-10 00:00:00」のデータしかselectされません。
だから、より正しくは、これかと思いきや、間違いです。
select * from ORDERDATE between '2009-08-10' and '2009-08-10 23:59:59.999'
「2009-08-11 01:00:00.000」のデータもselectされてしまいます。
正しくは、これです。最後のコンマ以降の最大値は「997」だからです。
select * from ORDERDATE between '2009-08-10' and '2009-08-10 23:59:59.998'
コンマ以降のことなど考えるのは面倒だから、betweenは使うのをやめます。こうします。
select * from ORDERDATE where orderdate >= '2009-08-10' and orderdate< '2009-08-11'
Dailyレポートを作成する夜間batchを作成するなら、最初に紹介したconvertを使うのが便利です。
select * from ORDERDATE
where orderdate >= convert(varchar(10),getdate()-1,111) and
orderdate< convert(varchar(10),getdate(),111)