You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按Active条件计算同EventId记录的起止时间差?

解决方法

你的原SQL逻辑存在两个核心问题:

  1. 将[TimeStamp]和pTimeStamp加入分组字段,导致同一EventId生成多余的结果行;
  2. 使用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

逻辑说明

  1. 子查询s:针对每个EventId筛选Active=1的记录,取最小的TimeStamp,即事件第一次激活的时间;
  2. 子查询e:针对每个EventId筛选Active=0的记录,取最大的TimeStamp,即事件最后一次关闭的时间;
  3. 通过EventId关联两个子查询的结果,用DATEDIFF计算两个时间的小时差。

执行后会得到你期望的结果:

EventIdStartTimeEndTimeTotalTime
ABC2022-12-20 19:07:26.67800002022-12-23 19:07:26.678000072
ABCD2022-12-25 05:17:29.84800002022-12-28 05:17:29.848000072

内容的提问来源于stack exchange,提问作者burak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:50:15