2017-08-28 59 views
1

我在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),但我無法弄清楚如何排除重疊時間。任何幫助,將不勝感激。謝謝!

+0

你可以添加一個樣本,包括重疊以瞭解邊界情況嗎? –

+0

根據您需要的粒度(例如1分鐘),將每個間隔分解爲一組行。在需要的時間間隔內統計不同的行數 – Serg

回答

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

This works!只需用更多的數據手動驗證即可。謝謝! – controller

+1

不用擔心@controller,只要記住要在滯後語句中添加一個分區,如果您需要通過其他唯一標識符對記錄進行分區。 – scsimon