0

特定の日付範囲が別の日付範囲に含まれているか、その上限または下限を包含しているか、または完全にラップしているかを確認する SQL クエリを作成しようとしています。現在、3 つの個別のクエリがありますが、単純化できると確信しています。

助言がありますか?

SELECT * FROM TABLE
WHERE
-- SURROUNDING
(DATE1 <= START_DT - 1 DAY AND DATE2 >= END_DT + 1 DAY)
-- ENCOMPASSED
OR(DATE1 >= START_DT AND DATE2 <= END_DT)
-- STRADDLED
OR(DATE1) BETWEEN START_DT AND END_DT
OR (DATE2) BETWEEN START_DT AND END_DT

DATE1 -> 範囲 -> DATE2

開始範囲 -> DATE1 -> DATE2 -> 終了範囲

DATE1 -> 開始範囲 -> DATE2 -> 終了範囲

開始範囲 -> DATE1 -> 終了範囲 -> DATE2

補足として、指定された範囲で + または - 1 日。Straddled は、範囲が停止する最終日 (または翌日) に開始できます。

4

1 に答える 1

3

2 つの範囲が重複しているかどうかを判断するには、2 つの条件をテストする必要があります。最初の開始が 2 番目の終了の前にあり、最初の終了が 2 番目の開始の後にある場合。

where (
  range_1_min_date <= range_2_max_date
  and
  range_1_max_date >= range_2_min_date
)

追加: なぜこれが条件なのかをここに画像の説明を入力理解するために、基本範囲 (図の下部に示されている range_1) を考えてから、date_range_2 の他のさまざまな可能性をすべて考えてみてください。

図を使用して、表示されている各範囲の上記の条件を確認すると、それが機能する理由がわかります。

于 2013-09-17T13:28:04.440 に答える