自分用メモ

期間と期間が一致するレコードを抽出したい。

なんとも言葉にし難くてググりにくいから残しておく。

 

例として、こんな感じにデータを持ってるテーブルがあったとして、

(考えうる全パターンのデータ、たぶん)

 

ID  開始日    終了日

001 2023/03/01 2023/03/31

002 2023/03/01 2023/04/03

003 2023/03/01 2023/04/05

004 2023/03/01 2023/04/07

005 2023/03/01 2023/04/10

006 2023/04/03 2023/04/05

007 2023/04/03 2023/04/07

008 2023/04/02 2023/04/10

009 2023/04/02 2023/04/04

010 2023/04/05 2023/04/07

011 2023/04/03 2023/04/10

012 2023/04/05 2023/04/10

013 2023/04/07 2023/04/10

014 2023/04/08 2023/04/10

 

開始日~終了日が対象期間:「2023/04/03 ~ 2023/04/07」に1日でも含まれるレコードを抽出したいというお話。

上記のデータ例でいうと、ID:002~013を抽出したい。

(ID:001、ID:014だけ抽出したくない。)

 

図にすると、こう。

 

で、考え方としてはカッコ書きで書いた通り、

ID:001、ID:014だけ抽出したくない。

 

ID:001の抽出条件は「レコードの終了日 < 対象期間の開始日」

ID:014の抽出条件は「対象期間の終了日 < レコードの開始日」

 

これをORで繋げると、ID:001、ID:014だけ抽出できる。

ので、最後にNOTでひっくり返せば、ID:001、ID:014だけ抽出しない条件となる。

NOT (

  レコードの終了日 < 対象期間の開始日

  OR

  対象期間の終了日 < レコードの開始日

)

 

※対象期間の開始日だけで終了日の指定なしとか、その逆とか必要なら、

 動的SQLで頑張ってORとその前後片方を消せばいい。

 静的SQLを使ってるなら、

 対象期間の開始日が未指定の場合は「0001/01/01」に置き換え。

 対象期間の終了日が未指定の場合は「9999/12/31」に置き換え。