Oracle SQL 開始日と終了日の間の範囲にかかっている日付を取得する方法
Oracle SQLで開始日と終了日の間の範囲にかかっている日付を取得する方法です。
実務の中では、契約期間やキャンペーン期間など、適用開始日付と適用終了日付を管理していくことがあります。
これらの日付の間(かかっている日付)をデータベースから取得したいという場合、ちょっと悩んでしまいますよね。
今回は SQL にてこれらの開始日と終了日の間を取得する方法 をご紹介します。
前提条件
まず前提条件として「開始日 ≦ 終了日」である必要があります。
画面を使って検索する場合は、開始日と終了日が逆になっていないか、あらかじめバリデーションチェックを仕掛けておきましょう。
チェックする必要があるのは以下の2つになります。
- データ上の開始日 ≦ 検索条件の開始日
- 検索条件の終了日 ≦ データ上の終了日
この2つの条件を満たす SQL を記述すれば取得は可能です。
具体的な SQL 条件指定する場合は、以下のようになります。
WHERE 検索条件の開始日 ≦ データ上の終了日
AND データ上の開始日 ≦ 検索条件の終了日
では、サンプルでチェックしていきましょう。
サンプル
今回使ったテーブルとデータです。
CREATE TABLE DATE_RANGE (
START_DATE DATE,
END_DATE DATE
);
INSERT INTO DATE_RANGE VALUES(TO_DATE('2013/02;01', 'YYYY/MM/DD'),TO_DATE('2014/01/31', 'YYYY/MM/DD'));
INSERT INTO DATE_RANGE VALUES(TO_DATE('2013/02;15', 'YYYY/MM/DD'),TO_DATE('2013/08/14', 'YYYY/MM/DD'));
INSERT INTO DATE_RANGE VALUES(TO_DATE('2013/02;21', 'YYYY/MM/DD'),TO_DATE('2014/02/20', 'YYYY/MM/DD'));
INSERT INTO DATE_RANGE VALUES(TO_DATE('2013/03;01', 'YYYY/MM/DD'),TO_DATE('2013/03/31', 'YYYY/MM/DD'));
INSERT INTO DATE_RANGE VALUES(TO_DATE('2014/02;01', 'YYYY/MM/DD'),TO_DATE('2099/12/31', 'YYYY/MM/DD'));
START_DATE | END_DATE |
---|---|
2013/02/01 | 2014/01/31 |
2013/02/15 | 2013/08/14 |
2013/02/21 | 2014/02/20 |
2013/03/01 | 2013/03/31 |
2014/02/01 | 2099/12/31 |
このデータから、開始日が2014/02/01、終了日が2014/02/28の間の範囲にかかっている日付を取得します。
SQL
SQLはこうなります。
SELECT * FROM DATE_RANGE
WHERE TO_DATE('2014/02/01','YYYY/MM/DD') <= END_DATE
AND START_DATE <= TO_DATE('2014/02/28','YYYY/MM/DD')
実行結果
実行結果はこうなります。
START_DATE | END_DATE |
---|---|
2013/02/21 | 2014/02/20 |
2014/02/01 | 2099/12/31 |
おおおー、範囲外にある日付データが除外された結果が得られましたー^^
まとめ
Oracle SQLで開始日と終了日の間の範囲にかかっている日付を取得する方法を紹介しました。
この日付範囲検索は、実務で本当によく利用されますので、しっかり覚えておきたいですね。
おつかれさまでした。