寻找两个时间范围之间的日期差距

时间:2018-11-14 06:06:18

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

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

我的任务的甘特图图示:

enter image description here

样本表结构

count1=x;
for(count=0;count<x;count++) {
    c=word.substring((count1)-1,count1);
    System.out.println(c);
    count1--;
}

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

+-----------+------+-------+---------------------+---------------------+-----------+
| 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      | 
+-----------+------+-------+---------------------+---------------------+-----------+
  • 输出是通过执行自连接将负载时间范围绑定到设备状态而得出的。
  • 将每个设备状态更改的第一行的load_inTIME与equipment_inTIME进行比较
  • 使用lag()函数将load_inTIME的后续行与先前的load_outTIME进行比较

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

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

回答得太快了。很抱歉,如果其他答案都没有通过。在第二张桌子下面没有看到您的评论。

太好了,我认为您需要对表进行一些修改,而不是对其进行更改,而是需要使用一个临时数据集(CTE / temp table / etc ...)。您需要获取数据来表示在图表上看到的关于跨越负载和马赫时间线的上下黑线的大黑线。

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

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

相关问题