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

日期 1 -> 范围 -> 日期 2

开始范围 -> 日期 1 -> 日期 2 -> 结束范围

日期 1 -> 开始范围 -> 日期 2 -> 结束范围

开始范围 -> DATE1 -> 结束范围 -> DATE2

并作为旁注+或-在给定范围内的一天;Straddled 可以在范围停止等的最后一天(或后一天)开始。

4

1 回答 1

3

您需要测试两个条件以确定两个范围是否重叠。如果第一个开始在第二个结束之前,如果第一个结束在第二个开始之后。

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 回答