事件的总持续时间,可能的间隙和间隔的重叠

时间:2014-08-20 08:38:17

标签: sql sql-server sql-server-2008-r2

有一个时间间隔列表。始终有一个开始和结束日期时间,例如:

TimeFrom                  TimeTill
2014-07-10 07:00:00.000   2014-07-10 11:30:00.000
2014-07-10 13:00:00.000   2014-07-10 14:00:00.000
2014-07-10 13:00:00.000   2014-07-10 14:30:00.000

TimeFromTimeTill都在同一天,没有例外。我们假设这代表了在不同项目上工作的时间(在这种情况下为三个)。允许重叠。

我想请求SQL Server 2008 R2查询的帮助,以获取该人在白天工作的总时间。

请注意,有一段时间没有工作。在这种情况下,它是在11:30和13:00之间。

当我使用min(TimeFrom)max(TimeTill)来计算最早开始和最后完成之间的持续时间时,它对重叠工作得很好,除了我无法减去没有工作的间隔。

所需的输出就是这一行:

Day         TimeWorking
2014-07-10  360

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您可以构建一整天的1分钟间隔列表。 exists查询可以过滤掉分钟而无需工作。结果计数是完成工作的分钟数:

; with  all_minutes as
        (
        select  cast('00:00' as time) as time
        union all
        select  dateadd(minute, 1, time)
        from    all_minutes
        where   time < cast('23:59' as time)
        )
select  cast(yt.TimeFrom as date) as day
,       count(distinct am.time) as minutes_worked
from    YourTable yt
left join
        all_minutes am
on      cast(yt.TimeFrom as time) <= am.time
        and am.time < cast(yt.TimeTo as time)
group by
        cast(TimeFrom as date)
option  (maxrecursion 0)
;

Example at SQL Fiddle.