3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(SQL)日付処理まわりの注意 - SQL Server

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の部分には日付のフォーマットが入るようです。

フォーマットについては下記のサイトに載っていました。

CONVERTを使いこなそう!! ~日付編~

MSDN:CAST および CONVERT (Transact-SQL)(CONVERTの使い方も載ってます)

ちなみに、上記の例の 112 だと YYYYMMDD(20080604)という形でフォーマットされます。

しかし、SQLはいまだに苦手ですね。

業務では1kLineもあるようなSQLとかも見かけますが、あんなのは触りたくないです。