如果EndDateTime是第二天(午夜之后),Sql将条目拆分为两个条目



我有这个查询:

select 
sth.Id,
sth.CreatedDateTime, 
EndDateTime = Lead(sth.CreatedDateTime, 1) over (partition by sth.Id order by sth.Id, sth.CreatedDateTime)
from 
Sth as sth
order by 
sth.Id, sth.CreatedDateTime

返回以下结果:

Id        StartDateTime                 EndDate                     
--------------------------------------------------------------------
2746743   2019-11-20 14:35:05.5841266   NULL                         
2746744   2019-11-20 14:35:05.5841266   NULL                         
3         2018-06-25 23:35:12.2799952   2018-06-26 09:57:27.8943163  
13        2018-06-26 09:57:27.8943163   2018-06-26 10:41:19.2973307  

我被要求更新上面的查询,将具有Id=3的行拆分为两行。

意思是:正如你所看到的,Id 3的记录从23:35 and ends the **next day** at 09:57开始

我需要它把这张唱片一分为二。

第一个应该来自23:35 -> 23:59

下面的应该来自00:00 -> 09:57

如果记录跨度超过一天。什么都不需要做此外,最终解决方案应该能够用于历史记录表超过300万行

所以记录应该导致类似的结果

Id     StartDateTime                    EndDateTime
3      2018-06-25 23:35:12.2799952      2018-06-25 23:59:59.000000
3      2018-06-26 00:00:00.0000000      2018-06-26 09:57:27.8943163

我希望这是有道理的!

所有其他记录都将产生类似的结果。有些记录不需要拆分。

问题中的结果集不能是指定查询的结果(每个id的结束日期都有一个null值(。因此,我将这个问题解释为处理结束日期存在且开始日期后一天的情况。

我只想使用横向连接:

with t as (
select sth.*, CreatedDateTime as StartDateTime,
Lead(sth.CreatedDateTime, 1) over (partition by sth.Id order by sth.Id, sth.CreatedDateTime) as EndDateTime
from Sth as sth
)
select t.id, v.*
from t cross apply
(values (startdatetime,
(case when datediff(day, startdatetime, enddatetime) = 1
then dateadd(second, -1, dateadd(day, 1, convert(datetime, convert(date, startdatetime))))
else enddatetime
end)
),
(dateadd(day, 1, convert(date, startdatetime)),
(case when datediff(day, startdatetime, enddatetime) = 1
then enddatetime
end)
)
) v(startdatetime, enddatetime)
where v.enddatetime is not null;

这是一个数据库<>不停摆弄

最新更新