3

这实际上是我关于stackoverflow的第一个问题,所以如果我感到困惑或不清楚,我真诚地道歉。

话虽如此,这是我的问题:

我在一家汽车制造公司工作,我们最近实现了跟踪机器何时空闲的功能。这是通过评估称为“idle_start”的事件的开始和结束时间来完成的。

现在,我正在尝试获取机器空闲时间的总和。现在,我想通了,但有些 idle_times 超过 24 小时。

因此,当我指定我只想查看某一天的 idle_time 总和时,总和还计算过去 24 小时的空闲时间。

我想在那 24 小时内提供 CUTTING OFF 的选项。这可能吗?

这是查询:

{代码}

SELECT  r.`name` 'Producer'
     ,  m.`name` 'Manufacturer'
      -- , timediff(re.time_end, re.time_start) 'Idle Time Length'
      , SEC_TO_TIME(SUM((TIME_TO_SEC(TIMEDIFF(re.time_end, re.time_start))))) 'Total Time'
      , (SUM((TIME_TO_SEC(TIMEDIFF(re.time_end, re.time_start)))))/3600 'Total Time in Hours'
      , (((SUM((TIME_TO_SEC(TIMEDIFF(re.time_end, re.time_start)))))/3600))/((IF(r.resource_status_id = 2, COUNT(r.resource_id), NULL))*24) 'Percent Machine is Idle divided by Machine Hours'
 FROM resource_event re 
 JOIN resource_event_type ret
   ON re.resource_event_type_id  = ret.resource_event_type_id
 JOIN resource_event_type reep
   ON ret.parent_resource_event_type_id = reep.resource_event_type_id
 JOIN resource r
   ON r.`resource_id` = re.`resource_id`  
 JOIN manufacturer m
   ON m.`manufacturer_id` = r.`manufacturer_id`
WHERE re.`resource_event_type_id` = 19
  AND ret.`parent_resource_event_type_id` = 3
  AND DATE_FORMAT(re.time_start, '%Y-%m-%d') >= '2013-08-12'
   AND DATE_FORMAT(re.time_start, '%Y-%m-%d') <= '2013-08-18'
 -- AND re.`resource_id` = 8
  AND "Idle Time Length" IS NOT NULL
  AND  r.manufacturer_id = 13
  AND r.resource_status_id = 2
GROUP BY 1, 2

随意忽略顶部的破折号。请告诉我是否可以更具体地解决这个问题并为那些愿意帮助我的人提供更少的头痛。

太感谢了!

4

3 回答 3

2

你会想要一个有条件的SUM,使用CASE.

不确定您的数据库的语法,但类似于:

, SUM (CASE WHEN TIME_TO_SEC(TIMEDIFF(re.time_end, re.time_start))/3600 > 24 THEN 0
            ELSE TIME_TO_SEC(TIMEDIFF(re.time_end, re.time_start))/3600
       END)'Total Time in Hours'
于 2013-08-30T18:55:25.773 回答
1

你想在开始/结束在你的时间范围之前/之后切断吗?

您可以使用案例根据您的时间范围进行调整,例如 time_start

case
  when re.time_start < timestamp '2013-08-12 00:00:00' 
    then timestamp '2013-08-12 00:00:00' 
  else re.time_start
end

与 time_end 类似,然后在您的 TIMEDIFF 中使用这些 CASE。

顺便说一句,给定日期范围的 where 条件应该是:

where time_start < timestamp '2013-08-19 00:00:00'
  and time_end >= timestamp '2013-08-12 00:00:00'

这将返回 2013-08-12 和 2013-08-18 之间的所有空闲时间

于 2013-08-30T22:17:02.047 回答
1

这不是试图回答你的问题。它被呈现为一个答案,而不是一个更好的格式和可读性的评论。

你有这个

AND DATE_FORMAT(re.time_start, '%Y-%m-%d') >= '2013-08-12'
AND DATE_FORMAT(re.time_start, '%Y-%m-%d') <= '2013-08-18'

在你的 where 子句中。使用这样的函数会使您的查询需要更长的时间来执行,尤其是在索引字段上。这样的事情会运行得更快。

AND re.time_start >= a date value goes here
AND re.time_start <= another date value goes here
于 2013-08-30T19:37:18.590 回答