将平时涉及到的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