我正在尝试提出一个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 - &gt;范围 - &gt; DATE2
START RANGE - &gt; DATE1 - &gt; DATE2 - &gt;结束范围
DATE1 - &gt; START RANGE - &gt; DATE2 - &gt;结束范围
START RANGE - &gt; DATE1 - &gt;结束范围 - &gt; DATE2
作为旁注+或 - 在给定范围内的一天; Straddled可以在范围停止等的最后一天(或后一天)开始。
答案 0 :(得分:3)
您需要测试两个条件以确定两个范围是否重叠。如果第一个的开头是在第二个结束之前,并且第一个的结尾是在第二个的开始之后。
where (
range_1_min_date <= range_2_max_date
and
range_1_max_date >= range_2_min_date
)
添加了: 为了说明这是条件的原因,考虑一个基本范围(范围_1,显示在图的底部),然后考虑date_range_2的所有其他各种可能性。
使用该图表,查看上面显示的每个范围的条件,您将看到它的工作原理。