將平時涉及到的sql 有關時間處理的查詢整理一下:
場景1:時間段篩選,時間段取交集
商家將商品放到不同的銷售平台上進行銷售,A商品參與了A平台某個時段的活動(減價時段),需要進行減價銷售,
同時A商品此時可能也參與了B平台的活動,B平台要求該商品參與活動期間在所有平台中是價格最低(保價價格、保價時段),
所以現在要對A商品在A平台某一時段進行減價時需要考慮到是否有參與了B平台的活動
要求:查出該商品在減價時段期間是否參與了其他平台活動,若有則查出該商品在其他平台的保價價格,保價時段
思路:
查出減價時段是否存在保價時段(即存兩個時段存在交集),若有交集則列出保價價格。保價時段
那么有交集是哪幾種情況呢?
如圖:如果存在以下四種情況之一,則需要查出保價價格
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