DB上で本日が○/○~○/○に含まれているデータを取りたい(境界線日は含む)という場合がありました。
最初は
SELECT * FROM table
WHERE GETDATE() BETWEEN StartDate AND EndDate
と入れていましたが、これは間違いです。
(StartDate,EndDate列は時刻は00:00:00が入っているという設定です。
なぜならSQL ServerのDatetime型は日付だけでなく時間も含むからです。
参考:新人SEのためのSQLの基礎 第3回(前半) 日付型の注意点
ということで時間を切り捨てて比較する必要があります。
とりあえず下記の2つを考えてみました。
■比較するdatetime型すべてを日付だけの文字列に変換し、文字列で比較する。
CONVERT(varchar,GETDATE(),112) BETWEEN CONVERT(varchar,StartDate,112) AND CONVERT(varchar,EndDate,112)
■比較するdatetime型すべてを日付を切ったdatetime型に変換(時刻は00:00:00)し、比較する。
CONVERT(datetime,CONVERT(varhcar,GETDATE(),112)) BETWEEN StartDate AND EndDate
(この方法は田舎娘のプログラマ生活さんを参考にさせてもらいました。)
一応どちらも正しい結果が返ってきたのでOKだとは思います。
(SQL ServerだとCONVERT関数ですが、OracleだとTO_CHAR関数になるんですかね?)
なお、CONVERT(xxxx,datetime型,style)のstyleの部分には日付のフォーマットが入るようです。
フォーマットについては下記のサイトに載っていました。
MSDN:CAST および CONVERT (Transact-SQL)(CONVERTの使い方も載ってます)
ちなみに、上記の例の 112 だと YYYYMMDD(20080604)という形でフォーマットされます。
しかし、SQLはいまだに苦手ですね。
業務では1kLineもあるようなSQLとかも見かけますが、あんなのは触りたくないです。