將平時涉及到的sql 有關時間處理的查詢整理一下:sql
場景1:時間段篩選,時間段取交集數據庫
商家將商品放到不一樣的銷售平臺上進行銷售,A商品參與了A平臺某個時段的活動(減價時段),須要進行減價銷售,spa
同時A商品此時可能也參與了B平臺的活動,B平臺要求該商品參與活動期間在全部平臺中是價格最低(保價價格、保價時段),code
因此如今要對A商品在A平臺某一時段進行減價時須要考慮到是否有參與了B平臺的活動orm
要求:查出該商品在減價時段期間是否參與了其餘平臺活動,如有則查出該商品在其餘平臺的保價價格,保價時段blog
思路:it
查出減價時段是否存在保價時段(即存兩個時段存在交集),如有交集則列出保價價格。保價時段table
那麼有交集是哪幾種狀況呢?form
如圖:若是存在如下四種狀況之一,則須要查出保價價格class
1.① ② 兩種狀況都是減價時段與保價時段有一部分交集
2.第三種狀況③則是減價時段徹底在保價時段內
3.第四種狀況則是減價時段包含了保價時段
那麼咱們如今應該如何用最短的sql語句查出全部有交集的狀況呢?
以下:
Select * from table where cut_from between protect_form and protect_to OR cut_from between protect_form and protect_to OR protect_from between cut_from and cut_to
場景二 時間段合併
同一商品可能在不一樣平臺設置了不一樣的保價時間段且價格相同存入了數據庫,如今須要合併爲一條記錄查詢出來
如圖所示,商品item爲100且價格爲60有多條保價記錄,現要求將相同價格的同一商品的多條保價記錄根據時間合併爲一條記錄(時間有交集則合併)
合併後爲
sql如何去實現?
sql代碼以下
SELECT X.item,X.protect_from,MIN(Y.protect_to) AS protect_to,X.protect_price INTO #temp01 FROM (SELECT
T1.item,T1.protect_from,T1.protect_price FROM temp_protect AS T1 LEFT OUTER JOIN temp_protect AS T2 ON T1. protect_from > T2. protect_from AND T1. protect_from <= T2. protect_to AND T1.protect_price =T2.protect_price AND T1.item =T2.item GROUP BY T1. protect_from, T1.protect_price,T1.item HAVING COUNT(T2. protect_from) = 0 ) AS X --除去起始時間在別的時間段內 INNER JOIN --除去結束時間在別的時間段內 (SELECT
T3.item,T3.protect_to,T3.protect_price FROM temp_protect AS T3 LEFT OUTER JOIN
temp_protect AS T4 ON T3. protect_to >= T4. protect_from AND T3. protect_to < T4. protect_to
AND T3.protect_price =T4.protect_price AND T3.item =T4.item GROUP BY T3. protect_to,T3.protect_price,T3.item
HAVING COUNT(T4. protect_from) = 0
)AS Y ON X.protect_from <= Y.protect_to AND X.protect_price =Y.protect_price AND X.item =Y.item
GROUP BY X.item,X.protect_from,X.protect_price select * from #temp01