3

我有一个包含 startdatetime 和 enddatetime 的表。如何找到与其他日期重叠的特定日期时间:参见下面的示例

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

输出是 group by sitecode。并且重叠日期只考虑一次。最终输出是必需的:

站点代码“A”= 2.5 小时

4

3 回答 3

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);
于 2013-08-19T14:19:07.277 回答
4

这是少数几个可以在没有的情况下使用的示例之一HAVINGGROUP BY是的,这是可能的):

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

SQLFiddle 演示

于 2013-08-19T14:27:16.770 回答
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 秒。你可以将秒转换为天、小时、分钟和秒。

希望这对您有所帮助。

于 2013-08-20T13:17:43.310 回答