判断两个时间交叉

SQL中常常要判断两个时间段是否相交,该如何判断呢?比如两个时间段(S1,E1)和(S2,E2)。我最先想到的是下面的方法一。

方法一:(S1 BETWEEN S2 AND E2) OR (E1 BETWEEN S2 AND E2)。很好理解:一个时间段的开始时间S1在另一个时间中间(S2,E2),或者结束时间E1在另一个时间中间(S2,E2)。
这个方法比较繁琐,我们来看方法二.

 

方法二:本方法先考虑这两段时间什么情况下不相交,如下图:
   -----+-----------------+-----------------+--------------+--------------

         S1                    E1                  S2                 E2

   -----+-----------------+-----------------+--------------+--------------

         S2                    E2                  S1                 E1

 无非两种情况:(S1,E1)段在(S2,E2)段前面和(S1,E1)段在(S2,E2)段后面。其对应的表达式为:(S2 > E1) OR (S1 >  E2)。于是相交条件就是 NOT((S2 > E1) OR (S1 >  E2))该式等价于


(S2 <= E1)AND (S1 <= E2)

这就是我们要的。

其实方法一和方法二的条件是一致的:
((S1 <=  E2) AND (S1 >= S2)) OR ((E1 <= E2) AND (E1 >= S2))
  =>((S1 <= E2) AND (S1 >= S2) ) OR ((S1 <= E2 ) AND (E1 >= S2))  (因为S1 <= E1)
<=> (S1 <= E2) AND ((S1 >= S2) OR (E1 >= S2))
  => (S1 <= E2) AND ((E1 >= S2 ) OR (E1 >= S2))  (因为 S1 <= E1)
<=>(S1 <= E2) AND (E1 >= S2)

你可能感兴趣的:(SQL,c#,javascript,ViewUI)