2013-08-19 56 views
3

我有一個包含startdatetime和enddatetime的表。如何找到的particuler日期時間這是在其他日期重疊: 見下面的例子如何在SQL Server中查找重疊日期

create table #period (
    id int, 
    starttime datetime, 
    endtime datetime 
); 

insert into #period values 
(1,'2013-10-10 08:00:00' , '2013-10-10 10:00:00'), 
(2,'2013-10-10 08:10:00' , '2013-10-10 08:20:00'), 
(3,'2013-10-10 08:10:00' , '2013-10-10 08:30:00') 
(4,'2013-10-10 08:15:00' , '2013-10-10 08:25:00') 

select * from #period 


required output is '2013-10-10 08:15:00' , '2013-10-10 08:20:00' is getting overlapped in all the dates. 

expected output: '2013-10-10 08:15:00' '2013-10-10 08:20:00' 5 Min 

編輯:

我道歉先前的問題 這與例如適當的細節

create table #period 
(
    Sitecode varchar(20), 
    svrname varchar(10), 
    StartTime datetime, 
    downtimeEnd datetime 
) 
go 

insert into #period values 
('A','S1','2013-10-10 10:00:00' , '2013-10-10 11:00:00'), 
('A','S2','2013-10-10 10:00:00' , '2013-10-10 11:00:00'), 
('A','S3','2013-10-10 10:00:00' , '2013-10-10 11:00:00'), 
('A','S1','2013-10-10 03:00:00' , '2013-10-10 03:30:00'), 
('A','S2','2013-10-10 06:30:00' , '2013-10-10 07:30:00') 

select * from #period 

預計輸出爲:

Sitecode 'A' 
     Total 2.5 hours (below is the details) 
     '2013-10-10 10:00:00' , '2013-10-10 11:00:00' getting overlapp - 1 hour 
     '2013-10-10 03:00:00' , '2013-10-10 03:30:00' - .5 hour 
     '2013-10-10 06:30:00' , '2013-10-10 07:30:00'- 1 hour 

輸出是由sitecode組成的組。重疊日期只考慮一次。 最終的輸出要求:

SITECODE「A」 =2.5小時

+0

實際上你只是在問'ANY服務器停機的小時數是多少?'那麼,如果有十臺服務器停機一小時,那還只有一小時的停機時間?如果只有一臺服務器在不同的小時內停機,那還有一個小時的停機時間? – MatBailie

回答

4

如果您有一組時期,想的的重疊個個,那麼重疊打算介於最大開始時間和最小結束時間之間。

select cast(starttime as date) as thedate, max(starttime), min(endtime) 
from #periods 
group by cast(starttime as date); 

這假定開始和結束在同一日期。第一種方法是從日期時間值中提取日期(這可能會因數據庫而異)。此處的版本適用於SQL Server。

min(endtime)小於max(starttime)時,您沒有重疊。因此,要獲得日期與重疊:

select cast(starttime as date) as thedate, max(starttime), min(endtime) 
from #periods 
group by cast(starttime as date) 
having min(endtime) > max(starttime); 

編輯:

如果你想一個網站代碼中的重疊,只是添加到`GROUP BY:

select sitecode, cast(starttime as date) as thedate, max(starttime), min(endtime) 
from #periods 
group by sitecode, cast(starttime as date) 
having min(endtime) > max(starttime); 
+0

但上面amswer不會低於場景 創建表#period ( \t SITECODE VARCHAR(20), \t svrname VARCHAR(10), \t開始時間日期時間, \t downtimeEnd日期時間 ) 去 INSERT INTO工作('B','S2','S1','2013-10-10 07:00:00','2013-10-10 07:10:00'), '2013-10-10 08:10:00','2013-10-10 08:20:00'), ('C','S3','2013-10-10 08:10:00', '2013-10-10 08:30:00'), ('A','S1','2013-10-10 08:15:00','2013-10-10 08:25:00') select * from #period –

+0

@ anjali.deshetti。 。 。首先,當你想要在評論中放置代碼時,首先考慮編輯你的問題。它使它更可讀。其次,評論中的數據沒有重疊。上述查詢不會返回任何內容。 –

+1

@ anjali.deshetti如果您有其他要求和新的樣本數據,請更新您的問題。 –

4

這是一個的幾個例子,說明它可能是有意義的使用HAVING沒有GROUP BY(是的,它是可能的):

SELECT MAX(starttime), MIN(endtime) 
FROM #period 
HAVING MIN(endtime) > MAX(starttime); 

SQLFiddle DEMO

0

請試試這個:

SELECT SUM(b.tm) FROM (
    SELECT datediff(second, StartTime, downtimeEnd) AS tm FROM ( 
    SELECT DISTINCT StartTime, downtimeEnd FROM #period 
) AS a 
) AS b 

的輸出將是9000秒。比你可以將秒轉換爲天,小時,分鐘和秒。

希望這可以幫助你。