Oracle判斷兩個時間段是否相交


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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM