计算一天的事件总持续时间

时间:2011-10-25 11:20:21

标签: tsql

我们有一个名为Events的表,其中包含Id(int),EventDate(DateTime),EventStart(datetime)和EventEnd(datetime)列。

所有事件在一天开始和结束(即没有事件在第二天结束),但是在给定日期的事件可能在它们之间重叠(包括其中一个事件可能完全覆盖另一个事件)。

指定日期可能会发生任意数量的事件。

我想,在一天内计算在T-SQL中至少运行一个事件的总持续时间。我可以选择给定日期的事件,甚至编写一个函数,如果两个事件重叠则返回true,否则返回false。

然而,我被困在如何成对地获取记录并通过我的函数运行它们,适当地添加持续时间直到我用完事件。

你能帮忙吗?

克里斯

1 个答案:

答案 0 :(得分:1)

试试这个:

--test table
declare @t table(fromt datetime, tot datetime)
--test data
insert @t values('2011-01-01 10:00', '2011-01-01 11:00')
insert @t values('2011-01-01 10:00', '2011-01-01 10:05')
insert @t values('2011-01-01 10:30', '2011-01-01 11:30')
insert @t values('2011-01-01 12:00', '2011-01-01 12:30')
insert @t values('2011-01-02 12:00', '2011-01-02 12:30')

--query
;with f as
(
    select distinct fromt from @t t 
    where not exists(select 1 from @t where t.fromt > fromt and t.fromt < tot)
), t as
(
    select distinct tot from @t t 
    where not exists(select 1 from @t where t.tot >= fromt and t.tot < tot)
), s as
(
    select datediff(day, 0, fromt) d, datediff(second, fromt, (select min(tot) 
      from t where f.fromt < tot and datediff(day, f.fromt, tot) = 0)) sec 
    from f
)
select dateadd(day, 0, d) day, sum(sec)/60 [minutes]
from s
group by d
order by d

结果:

day                     minutes
----------------------- -------
2011-01-01 00:00:00.000 120
2011-01-02 00:00:00.000 30