【问题标题】:Calculate time elapsed for each category in SQL计算 SQL 中每个类别经过的时间
【发布时间】:2021-04-11 06:53:09
【问题描述】:

我需要一个设备跟进项目的帮助。

我有一个包含 3 列(设备名称、状态、状态更改日期(DATETIME 格式))的 SQL 表。

EQUIPMENT STATUS CHANGEDATE
EQUIPMENT-1 QUALIFICATION 2020-06-30 09:37:42
EQUIPMENT-1 WAIT REPAIR 2020-06-30 16:29:20
EQUIPMENT-1 UP 2020-07-27 14:19:33
EQUIPMENT-1 ENGINEERING 2020-09-18 15:25:01
EQUIPMENT-1 UP 2020-09-20 17:31:53

这个想法是在2个固定日期之间确定每个状态下每个设备的经过时间。

例如,我想知道2020-07-012020-10-01之间所有状态下EQUIPMENT-1的经过时间表格结果是这样的

STATUS ELAPSED TIME (in days)
WAIT REPAIR 26,60
UP 63,31 (10,27 + 53,05)
ENGINEERING 2,09

今天我有一个 C# 代码来计算这些经过的时间,但它很慢...... 所以我想知道用 SQL 查询替换这个过程是否容易。

感谢您的帮助,

【问题讨论】:

  • 您可以查看 DATEDIFF SQL 函数
  • 您使用的是哪个 dbms? (在日期/时间方面,许多产品远不符合 ANSI SQL。)
  • 对不起,我用的是 SQL Server (2012)

标签: sql sql-server sql-server-2012


【解决方案1】:

认为你想要lead() 和聚合:

select equipment, status,
       sum(datediff(minute,
                    changedate,
                    coalesce(next_changedate, '2020-10-01')
                   ) / (24 * 60.0)
          ) as decimal_days
from (select t.*,
             lead(changedate) over (partition by equipment order by changedate)
      from t
      where changedate >= '2020-07-01' and changedate < '2020-10-01'
     ) t
group by equipment, status;

编辑:

如果您也需要初始时间:

select equipment, status,
       sum(datediff(minute,
                    (case when changedate < '2020-07-01' then '2020-07-01' else changeddate end),
                    coalesce(next_changedate, '2020-10-01')
                   ) / (24 * 60.0)
          ) as decimal_days
from (select t.*,
             lead(changedate) over (partition by equipment order by changedate) as next_changedate
      from t
     ) t
where changedate >= '2020-07-01' and changedate < '2020-10-01' or
      next_changedate >= '2020-07-01' and next_changedate < '2020-10-01' or
group by equipment, status;

【讨论】:

  • 谢谢 Gordon,差不多了。只是错过了 2020-07-01 和 2020-07-27 之间的时间(第一行)
  • 感谢 Gordon 的编辑,我只需要在子选择中添加“WHERE CHANGEDATE
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
相关资源
最近更新 更多