#author("2023-12-16T20:07:22+09:00","","")
#navi(../)
* 開始日と終了日を条件に期間内に該当するレコードを取得するSQL [#jaa6425f]
WHERE句の条件としての開始日(時)と終了日(時)がパラメータとして渡され、
この期間と重なるレコードを抽出するSQLになります。~
テーブルも開始日(時) の start_date, 終了日(時)の end_date カラムが存在します。

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

#contents

* 条件に指定する日が範囲内にあるかどうかを確認するSQL [#x9bd2060]
範囲内にあるかどうか確認する日付を check_start_date と check_end_date とし、~
レコードの開始日は start_date、終了日は end_date とします。~

** 答え [#kc25d5b8]
先に答えを記します。
 WHERE
     start_date <= check_end_date
 AND end_date   >= checK_start_date
となります。

** 実際に試してみる [#c628a5ed]
以下のテーブルを作成しデータを投入し試してみます。~
データベースは PostgreSQL を使って動作確認しました。

-作成したテーブル
 CREATE TABLE t1 (id int, start_date date, end_date date);
#br
-INSERTしたデータ
 INSERT INTO t1 VALUES
 ( 1,'2023-01-01','2023-01-31'),
 ( 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'),
 ( 9,'2023-09-01','2023-09-30'),
 (10,'2023-10-01','2023-10-31'),
 (11,'2023-11-01','2023-11-30'),
 (12,'2023-12-01','2023-12-31');
#br
-投入データの確認
 sakuradb=> SELECT * FROM T1;
  id | start_date |  end_date  
 ----+------------+------------
   1 | 2023-01-01 | 2023-01-31
   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
   9 | 2023-09-01 | 2023-09-30
  10 | 2023-10-01 | 2023-10-31
  11 | 2023-11-01 | 2023-11-30
  12 | 2023-12-01 | 2023-12-31
 (12 行)

** 開始日と終了日を条件に実行してみる [#t5136271]
以下のように範囲となる開始日と終了日を指定して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