有一个时间间隔列表。始终有一个开始和结束日期时间,例如:
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
TimeFrom
和TimeTill
都在同一天,没有例外。我们假设这代表了在不同项目上工作的时间(在这种情况下为三个)。允许重叠。
我想请求SQL Server 2008 R2查询的帮助,以获取该人在白天工作的总时间。
请注意,有一段时间没有工作。在这种情况下,它是在11:30和13:00之间。
当我使用min(TimeFrom)
和max(TimeTill)
来计算最早开始和最后完成之间的持续时间时,它对重叠工作得很好,除了我无法减去没有工作的间隔。
所需的输出就是这一行:
Day TimeWorking
2014-07-10 360
非常感谢您的帮助!
保
答案 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)
;