Oracle兩個時間段是否重合衝突

2021-10-23 20:15:36 字數 1188 閱讀 3570

oracle兩個時間段是否重合、衝突

經常會碰到比較兩個時間段是否衝突的情況.

思路1最開始比較2個時間是否的思路是,時間段的重疊. 但是比較時間段重疊的情況,就有幾種情況,

時間前段衝突.

時間a: 2015-10-01 —— 2015-10-05

時間b: 2015-10-03 —— 2015-10-08

b時間前半部分與a衝突

時間後段衝突.

時間a: 2015-10-05 —— 2015-10-10

時間b: 2015-10-03 —— 2015-10-08

b時間後半部分與a衝突

3.時間中段衝突.

時間a: 2015-10-05 —— 2015-10-10

時間b: 2015-10-03 —— 2015-10-15

b時間包含a時間

思路2對於上述的這些種情況.相對來說判斷分支比較多,寫起來比較複雜,後來整理了一下思路.換一種方式來. 通過取反的方式.這樣其實就只有2種情況了.

1.時間前段不衝突.

時間a:  2015-10-05  —— 2015-10-10

時間b: 2015-10-11 —— 2015-10-15

b的開始時間比a的結束時間還晚,肯定不衝突了.

2.時間後段不衝突.

時間a:  2015-10-05  —— 2015-10-10

時間b: 2015-10-01 —— 2015-10-04

b的結束時間比a的開始時間還早,也肯定不衝突了.

通過這2個情況,再取反.不就是兩個時間段有衝突的情況了嗎.oracle中借助not函式可以輕鬆取反. sql如下:

select … from table t where … and not ( t.betgintime > 『引數結束時間』 or t.endtime < 『引數開始時間』 )

例:select * from tr_schedule_affair where not((『2017-05-23 10:00』 > end_time) or (start_time > 『2017-05-23 12:30』))

通過begintime > 引數結束時間,可以找到時間前段不衝突的資料,

endtime < 引數開始時間,可以找到時間後段不衝突的資料.

再取反之後就是衝突的資料.

sql 判斷兩個時間段是否有重合,是否存在交集

總結起來就一句話 最小值小於最大值並且最大值大於最小值,則一定重疊。我的使用場景 a 表 將時間有交叉的資料查出來 我的演算法 start time,end time 1 and 2 1 剔除完全相同 a1.start time a2.start time and a1.end time a2.en...

時間段判斷重合

前言 需求是父級時間段不能和平級時間段重合,而每個父級裡包含n個子級時間,互相之間也不能重合 1 樣式 2 封裝函式 時間衝突比較 function timecompare starttimes,endtimes return true 時間轉秒 function convertsecond tim...

比較兩個時間段是否有時間交叉

比較兩個時間段是否有時間交叉 param starttime1 時間段1的開始時間 param endtime1 時間段1的結束時間 param starttime2 時間段2的開始時間 param endtime2 時間段2的結束時間 return 交叉 true 不交叉 false 傳入的4個引...