スタッフブログ

2012-05-09上口

DBの日付FROM~TOをFROM~TO条件で検索

技術ネタがなかなか出ませんのでひとつ。。

つい最近、図を書きながらブツブツ悩んでいた日付の範囲を検索するというものです。
以下のように「開始日」「終了日」が格納されたレコードがあります。
テーブル名:TBL
NO| START_DT | END_DT
--+------------+-----------
1 | 2012/04/01 | 2012/04/30
--+------------+-----------
2 | 2012/03/15 | 2012/03/25
--+------------+-----------
3 | 2012/04/01 | 2012/04/08
--+------------+-----------
4 | 2012/04/10 | 2012/04/15
--+------------+-----------
5 | 2012/04/20 | 2012/04/28
--+------------+-----------
6 | 2012/04/25 | 2012/05/01
----------------------------

探したい日付をFROM~TOで指定した場合、「開始日」「終了日」共に指定された期間内になければいけない場合はシンプルなのですが、1日でも該当すればヒットさせたい場合がちょっとメンドウです。

例えば探したい期間が 【 2012/04/05 ~ 2012/04/22 】 だった場合。

上のデータだとNO.1,3,4,5がヒットすればOKです。書き方は色々あると思いますが

select * from TBL where
(to_char(START_DT,'YYYY/MM/DD') between '2102/04/05' and '2012/04/22') or
(to_char(END_DT,'YYYY/MM/DD') between '2102/04/05' and '2012/04/22') or
(to_char(START_DT,'YYYY/MM/DD') <= '2102/04/05' and to_char(to_char(END_DT,'YYYY/MM/DD') >= '2012/04/22')

とかになりますかね。

しかし、逆の見方をするとNO.2,6を除くすべてのレコードという見方も出来るので

select * from TBL where NO not in
(select NO from TBL where to_char(START_DT,'YYYY/MM/DD') > '2102/04/22' or to_char(END_DT,'YYYY/MM/DD') < '2102/04/05')

というのもアリです。
組み方は個人の好みですが、私は後者の方がスッキリしていてスキです。

※START_DT、END_DT はtimestamp型の場合にto_char関数をかまします。
date型とかなら関数不要でもっとスッキリするのかな!?

(環境:PostgreSQL 8.4.9)
< ブログ一覧へ戻る

各種お問い合わせについて

インテリジェントレーベルでは、
開発や制作などのご相談の他にも、
様々なお問い合わせにお答えしております。
お気軽にお問い合わせください。

お問い合わせはこちらから

お電話でのお問い合わせ

tel.092-833-6633

平日10:00〜18:00