查找时间记录中的重叠

时间:2017-08-28 14:18:25

标签: sql sql-server sql-server-2012

我在SQL Server 2012数据库中有一个表,用于记录事件,列StartDateEndDate。我需要在特定时间段内汇总所有记录,并确定任何事件处于活动状态的持续时间,而不是计算重叠持续时间。例如,如果我的表看起来像这样:

 id     StartDate                EndDate
 =======================================================
 1     2017-08-28 12:00:00 PM    2017-08-28 12:01:00 PM
 2     2017-08-28 1:15:00 PM     2017-08-28 1:17:00 PM
 3     2017-08-28 1:16:00 PM     2017-08-28 1:20:00 PM
 4     2017-08-28 1:30:00 PM     2017-08-28 1:35:00 PM

我的搜索时间段是从2017-08-28 12:00:00 PM2017-08-28 2:00:00 PM,然后我想要的输出应该是:

Duration of Events Active = 00:11:00

我已经能够汇总记录并获得总持续时间(基本上只有EndDate - StartDate),但我无法弄清楚如何排除重叠时间。任何帮助,将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

CTE和聚合怎么样?这也可以通过子查询来完成。

declare @table table (id int, StartDate datetime, EndDate datetime)
insert into @table
values

( 1,'2017-08-28 12:00:00 PM','2017-08-28 12:01:00 PM'),
(2,'2017-08-28 1:15:00 PM','2017-08-28 1:17:00 PM'),
(3,'2017-08-28 1:16:00 PM','2017-08-28 1:20:00 PM'),
(4,'2017-08-28 1:30:00 PM','2017-08-28 1:35:00 PM')

declare @StartDate datetime = '2017-08-28 12:00:00'
declare @EndDate datetime = '2017-08-28 14:00:00'


;with cte as(
select
    id
    ,StartDate = case when StartDate < lag(EndDate) over (order by id) then lag(EndDate) over (order by id) else StartDate end
    ,EndDate
from 
    @table
where
    StartDate >= @StartDate
and EndDate <= @EndDate),


cte2 as(
select 
     Dur = datediff(second, StartDate, EndDate)
from cte)

select
    Dur = convert(varchar, dateadd(ms, sum(Dur) * 1000, 0), 114)
from
    cte2