我有两组时间,我们需要检查是否有重叠发生。如。(BeginTime_1, EndTime_1)和(BeginTime_2, EndTime_2)是两组时间。我需要知道这些时间是否重叠。是否可以用SQL
。我已经用C#
实现了,现在我需要用SQL
来实现。有任何内置功能来实现这一点吗?任何帮助都将非常感激。(我只考虑hh:mm:ss中的时间)
查询使用以下逻辑:
- 如果结束时间发生在其他开始和结束时间之间,则它们重叠。
- 同样,如果BeginTime出现在其他开始时间和结束时间之间,则它们重叠。
注意:它不考虑NULL值,因为即使任何列都是NULLABLE,您也需要澄清如何解释NULL。例如,NULL结束时间可能意味着它仍在进行中,应该假设当前时间为结束时间。
SELECT *
FROM TheTable
WHERE (EndTime_1 BETWEEN BeginTime_2 AND EndTime_2)
OR (EndTime_2 BETWEEN BeginTime_1 AND EndTime_1)
OR (BeginTime_1 BETWEEN BeginTime_2 AND EndTime_2)
OR (BeginTime_2 BETWEEN BeginTime_1 AND EndTime_1)
另一个方法是:
- 如果没有重叠,那么其中一个BeginTimes必须大于另一个EndTime。
- 如果上述条件不为真,则存在重叠。
假设开始/结束时间在逻辑上是一致的。
SELECT *
FROM TheTable
WHERE NOT (BeginTime_1 > EndTime_2 OR BeginTime_2 > EndTime_1)
应用逻辑规则,WHERE子句可以修改为:
WHERE BeginTime_1 <= EndTime_2 AND BeginTime_2 <= EndTime_1