【问题标题】:T-SQL Query for counting ongoing events per given intervals用于计算每个给定时间间隔正在进行的事件的 T-SQL 查询
【发布时间】:2014-02-06 17:56:16
【问题描述】:

我们有一个日期范围的事件:

活动 |开始 |结尾 ------|--------|------ 一个 | 11:30 | 12:15 乙 | 10:30 | 13:15 c | 11:30 | 13:30

可视化为时间表:

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

我们想要一个有效的查询来计算给定时间戳上正在进行的事件。在这个例子中,我们希望他们每小时。像这样:

时间 |进行中 -----------------|-------- 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

【问题讨论】:

    标签: sql tsql datetime


    【解决方案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 和group by,或者您可以更改cte 已满datetime。如果您的 cte 中跨度超过 100 个单位,您需要在查询的最后添加 OPTION (MAXRECURSION 0)。

    【讨论】:

      猜你喜欢
      • 2021-11-19
      • 2020-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      相关资源
      最近更新 更多