如何按Active条件计算同EventId记录的起止时间差?
解决方法
你的原SQL逻辑存在两个核心问题:
- 将
[TimeStamp]和pTimeStamp加入分组字段,导致同一EventId生成多余的结果行; - 使用
LAG函数的逻辑偏离需求,你不需要关联相邻时间记录,而是要分别提取每个EventId对应的第一个Active=1的时间和最后一个Active=0的时间。
正确的SQL语句
SELECT s.EventId, s.StartTime, e.EndTime, DATEDIFF(hour, s.StartTime, e.EndTime) AS TotalTime FROM ( -- 获取每个EventId首次激活(Active=1)的时间 SELECT EventId, MIN(TimeStamp) AS StartTime FROM [dbo].[Event] WHERE Active = 1 GROUP BY EventId ) s JOIN ( -- 获取每个EventId最后一次关闭(Active=0)的时间 SELECT EventId, MAX(TimeStamp) AS EndTime FROM [dbo].[Event] WHERE Active = 0 GROUP BY EventId ) e ON s.EventId = e.EventId
逻辑说明
- 子查询
s:针对每个EventId筛选Active=1的记录,取最小的TimeStamp,即事件第一次激活的时间; - 子查询
e:针对每个EventId筛选Active=0的记录,取最大的TimeStamp,即事件最后一次关闭的时间; - 通过
EventId关联两个子查询的结果,用DATEDIFF计算两个时间的小时差。
执行后会得到你期望的结果:
| EventId | StartTime | EndTime | TotalTime |
|---|---|---|---|
| ABC | 2022-12-20 19:07:26.6780000 | 2022-12-23 19:07:26.6780000 | 72 |
| ABCD | 2022-12-25 05:17:29.8480000 | 2022-12-28 05:17:29.8480000 | 72 |
内容的提问来源于stack exchange,提问作者burak
相关产品推荐
相关产品推荐

