首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >合并开始时间和结束时间之间没有间隙的时间表行

合并开始时间和结束时间之间没有间隙的时间表行
EN

Stack Overflow用户
提问于 2020-09-03 13:51:34
回答 1查看 37关注 0票数 1

我正在开发一个时间表系统,员工可以全天从事不同的工作。我需要执行某种类型的查询,以返回时间的合并版本,以便如果一名员工工作了一整天,在不同的工作之间没有任何休息,那么我只会得到该天的一行。但是,如果一行的结束时间与下一行的开始时间之间存在差距,则应将其作为单独的行返回。我还需要休息时间和总时间的总和。

我希望这是有意义的?我也许可以用光标或其他什么东西来做,但那不是最优雅的方法。

代码语言:javascript
代码运行次数:0
运行
复制
DECLARE @Times TABLE (StartTime DATETIME, EndTime DATETIME, BreakHours DECIMAL(8,2), TotalHours DECIMAL(8,2))
INSERT INTO @Times (StartTime, EndTime, BreakHours, TotalHours)
VALUES ('2020-08-24 07:00','2020-08-24 08:30',0.00,1.50)
,('2020-08-24 08:30','2020-08-24 12:00',0.50,3.00)
,('2020-08-24 12:00','2020-08-24 16:00',0.00,4.00)
,('2020-08-24 16:00','2020-08-24 17:30',0.00,1.50)
,('2020-08-25 07:00','2020-08-25 08:30',0.00,1.50)
,('2020-08-25 08:30','2020-08-25 11:45',0.50,2.75)
,('2020-08-25 12:00','2020-08-25 16:00',0.00,4.00)
,('2020-08-25 16:00','2020-08-25 17:45',0.00,1.75)
,('2020-08-25 23:00','2020-08-26 05:00',0.50,5.50)

这就是我希望看到的结果集。

代码语言:javascript
代码运行次数:0
运行
复制
StartTime           EndTime             BreakHours  TotalHours
2020-08-24 07:00    2020-08-24 17:30    0.50        10.00
2020-08-25 07:00    2020-08-25 11:45    0.50        4.25
2020-08-25 12:00    2020-08-25 17:45    0.00        5.75
2020-08-25 23:00    2020-08-26 05:00    0.50        5.50
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-03 15:32:52

这是一个差距和岛屿问题。一种方法是使用lag()来检索“之前”的结束日期和一个窗口sum(),该窗口在每次遇到差距时都会递增。这定义了相邻行的组,然后您可以聚合这些行:

代码语言:javascript
代码运行次数:0
运行
复制
select 
    min(starttime) starttime,
    max(endtime) endtime,
    sum(breakhours) breakhours,
    sum(totalhours) totalhours
from (
    select t.*, sum(case when starttime = lag_endtime then 0 else 1 end) over(order by starttime) grp
    from (
        select t.*, lag(endtime) over(order by starttime) lag_endtime
        from mytable t
    ) t
) t
group by grp

您的数据似乎缺少标识员工的列。如果有,通常会将其作为partition添加到窗口函数的over()子句和外部查询的group by子句中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63717619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档