SQL中常常要判斷兩個時間段是否相交,該如何判斷呢?比如兩個時間段(S1,E1)和(S2,E2)。我最先想到的是下面的方法一。
方法一:(S1 BETWEEN S2 AND E2) OR (S2 BETWEEN S1 AND E1)。很好理解:一個時間段的開始時間S1在另一個時間中間(S2,E2),或者開始時間S2在另一個時間中間(S1,E1),這個方法比較繁瑣
方法二:本方法先考慮這兩段時間什么情況下不相交,如圖:
-----+-----------------+-----------------+--------------+--------------
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)
這就是我們要的。
例:select * from tr_schedule_affair where not(('2017-05-23 10:00' > end_time) or (start_time > '2017-05-23 12:30'))
其實方法一和方法二的條件是一致的:
((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)
