自分用メモ
期間と期間が一致するレコードを抽出したい。
なんとも言葉にし難くてググりにくいから残しておく。
例として、こんな感じにデータを持ってるテーブルがあったとして、
(考えうる全パターンのデータ、たぶん)
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」に置き換え。