時(shí)間段重疊問(wèn)題,如何用SQL求解?
問(wèn)題描述
時(shí)間重疊指上下兩行數(shù)據(jù)的時(shí)間段有重疊部分,現(xiàn)在要找出這些在時(shí)間上有重疊的記錄。
具體問(wèn)題
有7個(gè)會(huì)議室,每個(gè)會(huì)議室每天都有人開(kāi)會(huì),某一天的開(kāi)會(huì)時(shí)間如下:

查詢出開(kāi)會(huì)時(shí)間有重疊的是哪幾個(gè)會(huì)議室?上面預(yù)期結(jié)果是
ID 2 3 4 5 6
問(wèn)題分析
為了方便分析,我們畫(huà)了如下一個(gè)草圖來(lái)具體描述。

圖中上面部分t和下面部分b有一段是重復(fù)的,分別是b.starttime到t.endtime部分。通過(guò)數(shù)學(xué)集合的思想,我們可以得出這個(gè)重疊部分的集合關(guān)系。
t.starttime<=b.endtime
AND t.endtime>=b.starttime
上面這個(gè)數(shù)學(xué)集合的重疊部分就是我們要的找的。
具體解法
--創(chuàng)建測(cè)試數(shù)據(jù)
WITH Meeting AS(
SELECT?1?ID,'08:00'?Starttime,'09:15'?Endtime
UNION?ALL
SELECT?2,'13:20','15:20'
UNION?ALL
SELECT?3,'10:00','14:00'
UNION?ALL
SELECT?4,'13:55','16:25'
UNION?ALL
SELECT?5,'14:00','17:45'
UNION?ALL
SELECT?6,'14:05','17:45'
UNION?ALL
SELECT?7,'18:05','19:45')
--查詢代碼
SELECT?DISTINCT?b.* FROM?Meeting t
JOIN?Meeting b ON?
t.Starttime<=b.Endtime
AND?t.Endtime>=b.Starttime
AND?b.ID <> t.ID --排除與自身時(shí)間相等的值
結(jié)果如下:

有興趣的小伙伴可以動(dòng)手做一下,興許下次面試就遇到了。

推薦閱讀
歡迎長(zhǎng)按掃碼關(guān)注「數(shù)據(jù)管道」
評(píng)論
圖片
表情
