開始日と終了日を条件に期間内に該当するレコードを取得するSQL

WHERE句の条件としての開始日(時)と終了日(時)がパラメータとして渡され、 この期間と重なるレコードを抽出するSQLになります。
テーブルも開始日(時) の start_date, 終了日(時)の end_date カラムが存在します。

で、いつも「どう書くんだっけ?」となるので記事にしました(苦笑)。

条件に指定する日が範囲内にあるかどうかを確認するSQL

範囲内にあるかどうか確認する日付を check_start_date と check_end_date とし、
レコードの開始日は start_date、終了日は end_date とします。

答え

先に答えを記します。

WHERE
    start_date <= check_end_date
AND end_date   >= checK_start_date

となります。

実際に試してみる

以下のテーブルを作成しデータを投入し試してみます。
データベースは PostgreSQL を使って動作確認しました。

開始日と終了日を条件に実行してみる

以下のように範囲となる開始日と終了日を指定してSQLを実行した結果です。

SELECT * FROM t1 WHERE start_date <= '2023-01-01' AND end_date >= '2022-01-01';
 id | start_date |  end_date  
----+------------+------------
  1 | 2023-01-01 | 2023-01-31
(1 行)
SELECT * FROM t1 WHERE start_date <= '2023-08-01' AND end_date >= '2023-02-02';
 id | start_date |  end_date  
----+------------+------------
  2 | 2023-02-01 | 2023-02-28
  3 | 2023-03-01 | 2023-03-31
  4 | 2023-04-01 | 2023-04-30
  5 | 2023-05-01 | 2023-05-31
  6 | 2023-06-01 | 2023-06-30
  7 | 2023-07-01 | 2023-07-31
  8 | 2023-08-01 | 2023-08-31
(7 行)
SELECT * FROM t1 WHERE start_date <= '2024-01-31' AND end_date >= '2023-11-11';
 id | start_date |  end_date  
----+------------+------------
 11 | 2023-11-01 | 2023-11-30
 12 | 2023-12-01 | 2023-12-31
(2 行)
SELECT * FROM t1 WHERE start_date <= '2024-01-31' AND end_date >= '2024-01-01';
 id | start_date | end_date 
----+------------+----------
(0 行)

以上、指定した範囲に該当するレコードを取得するWHER句の条件式でした。


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-12-16 (土) 20:07:22