【问题标题】:Total duration of events, possible gaps and overlaps in intervals事件的总持续时间、间隔中可能的间隙和重叠
【发布时间】:2014-08-20 08:38:17
【问题描述】:

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

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

非常感谢您的帮助!

保罗

【问题讨论】:

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


    【解决方案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.

    【讨论】:

    • 非常感谢 Andomar,就像魅力一样。只是出于好奇,在这种情况下,将日期作为新列包含在计数之前的推荐方法是什么?
    • 多天更新示例
    • 完美!非常感谢您的帮助,安多马尔。与我的数据完美配合,所有计算都是正确的。
    猜你喜欢
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多