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

Tsql 计算一天内事件的总持续时间,tsql,Tsql,我们有一个名为Events的表,其中包含Id(int)、EventDate(DateTime)、EventStart(DateTime)和EventEnd(DateTime)列 所有事件在同一天开始和结束(即,没有事件在第二天结束),但给定日期内的事件可能在它们之间重叠(包括其中一个事件可能完全覆盖另一个事件) 给定日期内可能发生任意数量的事件 我想计算一天内至少有一个事件在T-SQL中运行的总持续时间。我可以选择给定日期的事件,甚至编写了一个函数,如果两个事件重叠,则返回true;如果两个事件

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

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

给定日期内可能发生任意数量的事件

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

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

你能帮忙吗

克里斯

试试这个:

--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
试试这个:

--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

你能给出一些样本数据和一些预期的结果吗?我不确定我是否遵循了你的要求。你能给出一些样本数据和一些预期输出吗?我不确定我是否明白你的意思。回答得很好。第一次干得很有魅力!谢谢,回答得很好。第一次干得很有魅力!谢谢