合并时间表行,开始时间和结束时间之间没有间隔

Posted

技术标签:

【中文标题】合并时间表行,开始时间和结束时间之间没有间隔【英文标题】:Merge timesheet rows with no gap between start and finish times 【发布时间】:2020-09-03 05:51:34 【问题描述】:

我正在开发一个时间表系统,让员工全天从事各种工作。我需要进行某种查询,返回时间的合并版本,这样如果员工工作一整天而工作之间没有任何休息时间,那么我当天只会得到一行。但是,如果一行的结束时间和下一行的开始时间之间存在差距,那么这应该作为单独的行返回。我还需要休息时间和总小时数。

我希望这是有道理的?我可能可以用光标或其他东西来做,但这不是最优雅的方法。

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)

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

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

【问题讨论】:

请向我们展示您的尝试,以便我们为您提供帮助。 【参考方案1】:

这是一个空白和孤岛问题。一种方法使用lag() 来检索“上一个”结束日期和一个窗口sum(),每次满足间隙时都会增加。这定义了相邻行的组,然后您可以对其进行聚合:

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 子句中。

【讨论】:

以上是关于合并时间表行,开始时间和结束时间之间没有间隔的主要内容,如果未能解决你的问题,请参考以下文章

开始日期结束日期组合行

获取停止(第 x 行)和开始(第 x+1 行)之间的时间间隔

如何合并火花行

当一个的结束时间是另一个的开始时间时合并行(Oracle)

如何获得两个时间值之间的间隔

如何用excel计算两个日期之间相差的年数和月数