【问题标题】:Finding date gap between two timeframe查找两个时间范围之间的日期差距
【发布时间】:2019-04-17 01:23:15
【问题描述】:

当机器运行但没有运行任何负载时,我需要找出丢失的持续时间。该机器能够同时运行多个负载,这会产生大量重叠的日期时间。

我的任务的甘特图说明:

示例表结构

+-----------+------+-------+---------------------+---------------------+-----------+
| Equipment | Type | State |    Tracked_inTIME   |   Tracked_outTIME   | Load_Type |  
+-----------+------+-------+---------------------+---------------------+-----------+
| A1        | MACH | UP    | 2018-11-13 08:00:00 | 2018-11-13 10:00:00 | NULL      |  
| A1        | LOAD | NULL  | 2018-11-13 08:20:00 | 2018-11-13 09:43:00 | PROD      |  
| A1        | LOAD | NULL  | 2018-11-13 08:22:30 | 2018-11-13 09:55:00 | PROD      |  
| A1        | LOAD | NULL  | 2018-11-13 08:30:00 | 2018-11-13 10:11:00 | PROD      | 
| A1        | MACH | DOWN  | 2018-11-13 10:00:00 | 2018-11-13 10:35:00 | NULL      |  
| A1        | MACH | UP    | 2018-11-13 10:35:00 | 2018-11-13 15:11:00 | NULL      |  
| A1        | LOAD | NULL  | 2018-11-13 11:00:00 | 2018-11-13 11:51:00 | PROD      |  
| A1        | LOAD | NULL  | 2018-11-13 11:25:00 | 2018-11-13 11:55:00 | PROD      |  
| A1        | LOAD | NULL  | 2018-11-13 12:05:00 | 2018-11-13 14:11:00 | PROD      |  
| A1        | LOAD | NULL  | 2018-11-13 12:25:00 | 2018-11-13 13:05:00 | PROD      |  
| A1        | LOAD | NULL  | 2018-11-13 13:45:00 | 2018-11-13 15:11:00 | PROD      |  
| A2        | MACH | UP    | 2018-11-13 08:00:00 | 2018-11-13 14:05:00 | NULL      |  
| A2        | LOAD | NULL  | 2018-11-13 08:00:00 | 2018-11-13 14:05:00 | PROD      | 
+-----------+------+-------+---------------------+---------------------+-----------+

错误的输出(列:Gapduration = 40,应该为 0,因为机器仍在运行负载)

    +----+-------+---------------------+---------------------+---------------------+----------------------+-------------+
    | EQ | State |      EQ_inTIME      |     EQ_outTIME      |     LOAD_inTIME     |     LOAD_outTIME     | GapDuration |
    +----+-------+---------------------+---------------------+---------------------+----------------------+-------------+
    | A1 | UP    | 2018-11-13 08:00:00 | 2018-11-13 10:00:00 | 2018-11-13 08:20:00 |  2018-11-13 09:43:00 |          20 |
    | A1 | UP    | 2018-11-13 08:00:00 | 2018-11-13 10:00:00 | 2018-11-13 08:22:30 |  2018-11-13 09:55:00 |           0 |
    | A1 | UP    | 2018-11-13 08:00:00 | 2018-11-13 10:00:00 | 2018-11-13 08:30:00 |  2018-11-13 10:11:00 |           0 |
    | A1 | DOWN  | 2018-11-13 10:00:00 | 2018-11-13 10:35:00 | 2018-11-13 08:30:00 |  2018-11-13 10:11:00 |           0 |
    | A1 | UP    | 2018-11-13 10:35:00 | 2018-11-13 15:11:00 | 2018-11-13 11:00:00 |  2018-11-13 11:51:00 |          25 |
    | A1 | UP    | 2018-11-13 10:35:00 | 2018-11-13 15:11:00 | 2018-11-13 11:25:00 |  2018-11-13 11:55:00 |           0 |
    | A1 | UP    | 2018-11-13 10:35:00 | 2018-11-13 15:11:00 | 2018-11-13 12:05:00 | *2018-11-13 14:11:00 |          10 |
    | A1 | UP    | 2018-11-13 10:35:00 | 2018-11-13 15:11:00 | 2018-11-13 12:25:00 |  2018-11-13 13:05:00 |           0 |
    | A1 | UP    | 2018-11-13 10:35:00 | 2018-11-13 15:11:00 | 2018-11-13 13:45:00 |  2018-11-13 15:11:00 |          40 |
    | A2 | UP    | 2018-11-13 08:00:00 | 2018-11-13 14:05:00 | 2018-11-13 08:00:00 |  2018-11-13 14:05:00 |           0 |
    +----+-------+---------------------+---------------------+---------------------+----------------------+-------------+
  • 输出是通过执行自联接以将加载时间范围绑定到设备状态而得出的。
  • 每次设备状态变化第一行的load_inTIME与device_inTIME比较
  • 使用 lag() 函数将 load_inTIME 的后续行与前一个 load_outTIME 进行比较

  • 我遇到的主要问题是有一个加载时间范围(标有 *),它跨越了多个加载持续时间,我的计算没有考虑到

有什么建议吗?

【问题讨论】:

  • 这台机器好像可以同时运行多个负载?有什么算法吗?有什么限制吗?设置预先预测的作业开始/作业结束collums会很好
  • 我不明白甘特图上的红色是什么,也不知道你想要什么结果。
  • 对不起。红色代表机器停机的持续时间。我试图找出没有负载进入机器的持续时间,即使机器处于运行状态(启动状态)。

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


【解决方案1】:

几乎回答得太快了。抱歉,如果其他答案通过。我没有在第二张桌子下面看到你的 cmets。

太好了,我认为您需要稍微修改一下您的表,而不是更改它,而是获取一个临时数据集以使用(CTE/临时表/等...)。您需要获取数据来代表您在图表上看到的关于从上到下跨越负载和马赫时间线的大黑线。

基本上,您应该有一个连续的时间序列表示。这就是大黑线所要求的。当负载开始/停止时,这些时间应该与您的马赫上升/下降时间串联。对于每条记录,您将当前记录“Tracked_outTIME”与下一条记录(引导函数)“Tracked_inTIME”进行比较。如果 > 则以下一条记录“进入”时间结束当前记录“退出”时间,并创建一个标志来表示“is_loaded”。当从 is_loaded = 1 转换为 is_loaded = 0 或反之亦然时,您将在下一个/最终查询中使用它来查询您的新时序表以获取您的 datediff。

因此,您的第一个“匹配”记录不应达到 10,而应在加载开始时在 8:20 结束......依此类推,以创建您的新/临时表。然后查询该表。

【讨论】:

  • 我意识到我应该详细说明我在编辑中添加的问题。我遇到的主要问题是,会有一些负载比其他负载运行时间更长,这使得特定时间范围重叠多次。因此,即使 load_out 和下一个 load_in 时间之间有 40 分钟的差距,也不应该考虑它,因为机器仍在运行我在开头提到的特定负载。你能详细说明解决这个特定问题吗?
  • 自从我上次想到这个之后,我就睡着了,我的想法有点改变了。这更适合使用时间维度表。首先创建一个表,其中包含一天中每秒的记录(80k 条记录),然后您可以根据该日期维度加入您的马赫时间和加载时间表,以设置“machup/machdown”属性和“loadon/loadoff” “一天中每一秒的财产。您可以将 machup 和 loadoff 的记录数(或秒数)相加。
  • 您似乎已经非常熟悉 SQL 和超前/滞后功能,我希望您能从那里看到解决方案。有很多方法可以做到这一点,但我认为这里的关键是您将很难在一个查询中尝试执行此操作,并且让该查询针对您的原始源表(马赫和加载时间未链接)或不“合并”到单个时间线上。我的第一个建议会奏效(我认为),但查询变得越来越丑陋。如果您使用遇到此问题的数据类型,您将从约会中受益和时间维度表。
猜你喜欢
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 2019-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多