1.需求:查詢兩個時間段是否有交集
2.分析:分為三種情況:
入參:查詢開始時間,查詢結束時間
資料庫字段:start_date,end_date
2.1 :查詢開始時間在start_date與end_date之間,則肯定有交集
2.2 :查詢結束時間在start_date與end_date之間,則肯定有交集
2.3:查詢開始時間》=start_date,查詢結束時間<=end_date,則肯定有交集
其餘情況則無時間範圍的交集了。
3.sql成型:
3.1:正常思路的sql例子
按照上述思路,sql如下:
select * from 某個table c
where
((c.start_date >= '2018-01-01' and c.start_date<= '2018-12-31')
or (c.end_date >= '2018-01-01' and c.end_date<= '2018-12-31')
or (c.start_date <= '2018-01-01' and c.end_date>= '2018-12-31'))
and c.`status`=3;
3.2:反向查詢的sql思路:
只要start_date>查詢結束時間,則本條資料與當前查詢時間範圍肯定無交集
只要end_date《查詢開始時間,則本條資料與當前查詢時間範圍肯定無交集
所以,將上述兩種結果合併,並且取反,則是時間範圍有交集的資料。
sql如下:
select * from 某個table c
where c.`contract_type`=1
and not (c.`start_date`>'2018-12-31' or c.`end_date`<'2018-01-01')
and c.`status`=3
4.總結
上述兩個sql結果條數是一致的。有時候,反向考慮問題,能得到更簡潔的解決問題的方式
判斷兩個時間段範圍是否有交集
專案中經常會遇到判斷兩個時間段範圍是否有交集,所以本文就記錄下當時思考的過程和示例 本文提供兩種思路。1 參考時間段 包含 比較時間段 2 參考時間段 只包含 比較時間段結束時間 3 參考時間段 只包含 比較時間段開始時間 4 比較時間段 包含 參考時間段 根據圖示編寫的 示例 判斷兩個時間範圍是否...
sql語句判斷兩個時間段是否有交集
場景 資料庫有有兩個欄位.開始時間,和結束時間,指定乙個時間段 a,b a表示開始時間,b表示結束時間。看資料庫中有沒有與 a,b 衝突的時間段,有的話就返回那條記錄。解析 兩個時間段相當於兩個集合,不過是有順序的集合。兩個時間段有交集細分有四種情況。用sql直接判斷無交集的語句可能也有,但是目前沒...
sql語句判斷兩個時間段是否有交集
場景 資料庫有有兩個欄位.開始時間,和結束時間,指定乙個時間段 a,b a表示開始時間,b表示結束時間。看資料庫中有沒有與 a,b 衝突的時間段,有的話就返回那條記錄。解析 兩個時間段相當於兩個集合,不過是有順序的集合。兩個時間段有交集細分有四種情況。用sql直接判斷無交集的語句可能也有,但是目前沒...