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

时间:2014-05-12 16:17:07

标签: sql sql-server sql-server-2008

我有两组时间,我们需要检查一些重叠是否发生。例如。 (BeginTime_1,EndTime_1)和(BeginTime_2,EndTime_2)是两组时序。我需要找出这些时间是否重叠。是否可以使用SQL。我使用C#实现了它,现在我需要使用SQL来实现它。是否有任何内置功能来实现这一目标?任何帮助将受到高度赞赏。 (我只考虑时间......:mm:ss)

1 个答案:

答案 0 :(得分:1)

该查询使用以下逻辑:

  • 如果在其他开始和结束时间之间发生EndTime,则它们会重叠。
  • 同样,如果在其他开始和结束时间之间出现BeginTime,则它们会重叠。

注意:它不考虑NULL值,因为即使任何列都是NULLABLE,您也需要澄清NULLS应该如何解释。例如。 NULL EndTime可能意味着它仍在进行中并且应该将当前时间假定为EndTime。

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)

另一种方法是:

  • 如果没有重叠,那么其中一个BeginTime必须大于另一个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