【发布时间】:2021-05-21 17:32:56
【问题描述】:
抱歉,如果我没有给你正确的格式/打破礼仪,我通常会发布 python 问题,创建问题的虚拟示例很容易,但我的 SQL 技能还不足以做到这一点。非常感谢您的反馈。
我在 SQL 中有一个运行表,它监视运行的状态并记录运行和停止周期的开始和结束,如下所示。真实表从过去的某个日期开始运行,并将继续运行到未来,并且状态可以持续几秒、几分钟、几天、几周,尤其是停止。
| Start | End | Status |
|---|---|---|
| 2021-01-01 00:00:00.000 | 2021-01-01 00:30:00.000 | Run |
| 2021-01-01 00:30:00.000 | 2021-01-01 10:30:00.000 | Stop |
| 2021-01-01 10:30:00.000 | 2021-01-02 10:00:00.000 | Run |
| 2021-01-02 10:00:00.000 | 2021-01-02 17:00:00.000 | Run |
| 2021-01-02 17:00:00.000 | 2021-02-01 09:00:00.000 | Run |
我需要计算每小时的状态,每个小时开始的结果表如下所示(但直到当前小时) - 它会返回以分钟为单位的时间量(或秒)机器每小时处于每种状态。另外,我不是特别在意0,而是将它们放在示例中。
| Hour | Time in Status(mins) | Status |
|---|---|---|
| 2021-01-01 00:00:00.000 | 30 | Run |
| 2021-01-01 00:00:00.000 | 30 | Stop |
| 2021-01-01 01:00:00.000 | 0 | Run |
| 2021-01-01 01:00:00.000 | 60 | Stop |
| ... | ||
| 2021-02-01 08:00:00.000 | 60 | Run |
| 2021-02-01 08:00:00.000 | 0 | Stop |
我可以相对容易地计算当前的小时状态(即我可以返回 2020-01-01 00:00:00.000 运行了 30 分钟,停止了 30 分钟)但是当我尝试添加剩余的时间时,我的知识让我失望了到下一个小时的时间。
我正在 SQL Server 2017 上开发 SQL Server Management Studio。
【问题讨论】:
-
你想从什么时候开始?表格的开头?
-
那你怎么办?
-
本意是从表格的开头开始,但如果更容易,我们可以从 01-01-2021 开始(不是表格的真正开始,而是我用作示例的)。错过时间是什么意思?不应该有任何缺失的时间,只有机器处于停止模式很多小时的时间段。
-
缺少小时数意味着它们根本不存在于表中。而且我在我的回答中假设您希望
0用于该状态没有任何内容的任何时间,即您仍然需要该小时的一行和0的标题,因此我们需要一个 Hours 表。如果这些都不正确,我们可以删除 Hours 表。 -
啊,我明白了,是的,你是对的。欣赏解决方案;明天会尝试,可能会带着一些问题回来。感谢您抽出宝贵时间。
标签: sql-server