T-SQL查询用于按给定间隔计算正在进行的事件

时间:2014-02-06 17:56:17

标签: sql tsql datetime

我们有日期范围的活动:

Event | Begin | End
------|-------|------
a     | 11:30 | 12:15
b     | 10:30 | 13:15
c     | 11:30 | 13:30

可视化为时间表:

a)         |---|
b)   |---------------|
c)         |-----------|
  |-----|-----|-----|-----|
10:00 11:00 12:00 13:00 14:00

我们想要一个有效的查询来计算给定时间戳上的持续事件。在这个例子中,我们每小时都需要它们。像这样:

Time             | OnGoing
-----------------|--------
2014-02-06 10:00 | 0
2014-02-06 11:00 | 1
2014-02-06 12:00 | 3
2014-02-06 13:00 | 2
2014-02-06 14:00 | 0

1 个答案:

答案 0 :(得分:1)

您可以创建一个包含所有小时数的驱动程序表,然后加入到该表:

;WITH cal AS (SELECT CAST('10:00:00' AS TIME) dt
              UNION  ALL
              SELECT DATEADD(hour,1,dt)
              FROM cal
              WHERE dt < '14:00:00')
SELECT dt, COUNT(DISTINCT Event) OnGoing
FROM  cal a
LEFT JOIN Table1 b
 ON a.dt BETWEEN b.[Begin] AND b.[End]
GROUP BY dt

演示:SQL Fiddle

调整cal cte中的范围以符合您的偏好。我注意到您的示例输出显示的是datetime,因此您可以在关联中投放beginend作为TIME,并在DATE部分添加select部分1}}和group by,或者您可以将cte更改为已满datetime。如果您的cte中超过100个单元,则需要在查询的最后添加OPTION (MAXRECURSION 0)