我们有日期范围的活动:
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
答案 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
,因此您可以在关联中投放begin
和end
作为TIME
,并在DATE
部分添加select
部分1}}和group by
,或者您可以将cte更改为已满datetime
。如果您的cte中超过100个单元,则需要在查询的最后添加OPTION (MAXRECURSION 0)
。