如何使用SQL查找两次是否重叠



我有两组时间,我们需要检查是否有重叠发生。如。(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

最新更新