如何通过独特的时间跨度计算记录数?

时间:2011-12-02 18:24:49

标签: sql

我有一个包含一系列开始日期和结束日期的表,我正在试图找出存在多少个唯一会话 - 换句话说,有多少不同的时间段不重叠。

所以如果表格如下:

ID   |   StartTime   |   EndTime
 A   |  1/1/11 12:00 | 1/1/11 14:00
 B   |  1/1/11 12:30 | 1/1/11 15:00
 C   |  1/1/11 14:30 | 1/1/11 15:30
 D   |  1/1/11 16:00 | 1/1/11 16:30
 E   |  1/1/11 16:30 | 1/1/11 17:00

由于记录A,B和C重叠,哪种查询会返回3个会话?

1 个答案:

答案 0 :(得分:2)

试试这个。返回SQL Server 2008中的正确计数。

DECLARE @t table (id char(1), Starttime smalldatetime, endtime smalldatetime)

INSERT INTO @t
VALUES
('A','1/1/11 12:00','1/1/11 14:00'),
('B','1/1/11 12:30','1/1/11 15:00'),
('C','1/1/11 14:30','1/1/11 15:30'),
('D','1/1/11 16:00','1/1/11 16:30'),
('E','1/1/11 16:30','1/1/11 17:00')


select 
  count(t.id)
from
  @t t
WHERE NOT EXISTS (  SELECT 1 FROM @t t2
                    WHERE (t.starttime > t2.starttime
                    AND t.endtime < t2.starttime)
                    OR (t.starttime < t2.starttime
                    AND t.endtime > t2.starttime) )