如果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

我希望这有意义!

所有其他记录都会产生类似的结果。有一些记录是不需要拆分的,我有这样一个查询:select sth.Id, sth.CreatedDateTime, EndDateTime = Lead(sth.CreatedDateTime, 1)。

解决方案:

你的问题中的结果集不可能是你所指定的查询的结果(每一个 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;

这里 是一个db<>提琴。

给TA打赏
共{{data.count}}人
人已打赏
解决方案

通过方法流找到Rest映射信息

2022-5-12 21:00:27

解决方案

使用express.js,我可以从根目录外访问静态文件吗?

2022-5-12 21:00:31

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索