sql - SQL 将 Stretch Date 切割成不同的时间段
问题描述
我在一张桌子上有一大段日期,在另一张桌子上有一些日期要切。
有了这个,我需要得到另一张桌子,里面有其他日期切割的大桌子内的所有伸展。
我暂时有这个:
DECLARE @UTCSTARTDATE DATETIME='2020-01-20 00:00:00.00'
DECLARE @UTCENDDATE DATETIME='2020-01-20 04:00:00.00'
DECLARE @T1 TABLE
(
StartTime DATETIME,
EndTime DATETIME,
table_id int
)
DECLARE @T2 TABLE
(
CutTime DATETIME,
table2_id int
)
INSERT INTO @T1 SELECT @UTCSTARTDATE,@UTCENDDATE,1
INSERT INTO @T2 SELECT myCut,myID FROM (VALUES('2020-01-20 01:00:00.00',1),('2020-01-20 02:30:00.00',1),('2020-01-20 03:00:00.00',2))t2(myCut,myID)
SELECT * FROM @T1
SELECT * FROM @T2 order by CutTime ASC
DECLARE @STRETCHHOURSTABLE TABLE
(
startDate DATETIME,
endDate DATETIME
);
;WITH DATESPLITTER AS
(
SELECT
StartTime AS stretchStartDate,
(SELECT TOP(1) CutTime FROM @T2 where CutTime < EndTime AND table_id = table2_id order by CutTime ASC) AS stretchEndDate,
EndTime AS RealEndTime,
table_id AS RealID
FROM @T1
UNION ALL
SELECT
stretchEndDate,
(SELECT TOP(1) CutTime FROM @T2 where CutTime > stretchEndDate AND CutTime < RealEndTime AND table2_id = RealID order by CutTime ASC) AS stretchEndDate,
RealEndTime,
RealID
FROM DATESPLITTER
WHERE stretchEndDate < @UTCENDDATE
)
INSERT INTO @STRETCHHOURSTABLE (startDate, endDate)
SELECT
stretchStartDate,
CASE
WHEN @UTCENDDATE < stretchEndDate THEN @UTCENDDATE
ELSE stretchEndDate
END
FROM DATESPLITTER
SELECT * FROM @STRETCHHOURSTABLE
解决方案
这似乎基本上是lead()
在union all
:
select dt, lead(dt) over (order by dt)
from ((select v.dt
from @t1 t1 cross apply
(values (t1.startTime), (t1.endTime)) v(dt)
) union all
(select t2.cuttime
from @t2 t2
)
) t
这是一个 db<>fiddle。
推荐阅读
- python - PYTHON:更改列名
- python - How to get the cluster to which a cell belongs, using AllenSDK?
- python - 用于单输出分类的 TensorFlow RNN
- php - 注意:未定义变量:第 38 行 C:\wamp\www\public\index.php 中的 router_address
- python - 具有线性目标函数的 Python 离散优化
- java - 如何使用泛型和供应商 lambda 安全地修复抽象方法上的这种类型不匹配
- python - Django Rest 框架 - 发布外键
- python-3.x - Modulating Bokeh Servers within Flask
- mongodb - Mongo Aggregation Grouping and Mapping of Object Array
- ios - WCSession:在 iOS 上提交的数据永远不会在 Watch 上收到