试试这个,我做了些改变:
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 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);
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 cuttime from (SELECT row_number() over(partition by table2_id order by CutTime ASC) rn, CutTime FROM @T2 where CutTime < EndTime AND table_id = table2_id)a
where a.rn = 1) AS stretchEndDate,
EndTime AS RealEndTime,
table_id AS RealID
FROM @T1
UNION ALL
SELECT
stretchEndDate,
ISNULL((select cuttime from (SELECT row_number() over(partition by table2_id order by CutTime ASC) rn, CutTime FROM @T2 where CutTime > stretchEndDate AND CutTime < RealEndTime AND table2_id = RealID)a
where a.rn = 1), RealEndTime) 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 as sommm
FROM DATESPLITTER
SELECT * FROM @STRETCHHOURSTABLE