Sql 范围内的日期范围及更多

Sql 范围内的日期范围及更多,sql,db2,Sql,Db2,我正试图提出一个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 <= E

我正试图提出一个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->结束范围

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


作为旁注+或-给定范围内的一天;跨接可以从最后一天或距离停止后的第二天开始等。

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

where (
  range_1_min_date <= range_2_max_date
  and
  range_1_max_date >= range_2_min_date
)
增加: 为了解释为什么这是条件,考虑一个基本范围RangeE1,如图的底部所示,然后考虑DATEZRangeE2的各种其他可能性。
使用图表,查看上面显示的每个范围的条件,您将了解其工作原理。

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

where (
  range_1_min_date <= range_2_max_date
  and
  range_1_max_date >= range_2_min_date
)
增加: 为了解释为什么这是条件,考虑一个基本范围RangeE1,如图的底部所示,然后考虑DATEZRangeE2的各种其他可能性。
使用该图,查看上面显示的每个范围的条件,您将了解其工作原理。

发布当前查询以显示您尝试过的内容。发布当前查询以显示您尝试过的内容。这不是中间测试的基本内容吗?不,中间正是这一点。检查一个范围的起点或终点是否在另一个范围的起点和终点之间。因此,它只验证重叠范围的部分条件,这也是为什么在您的示例中需要其他条件的原因。这不就是between所测试的吗?不,between就是这样。检查一个范围的起点或终点是否在另一个范围的起点和终点之间。因此,它只验证重叠范围的部分条件,这就是为什么在您的示例中需要其他条件。