2013-08-30 26 views
3

这实际上是我的计算器上的第一个问题在24小时之内提供切断,所以如果我是混乱或不清楚我真诚道歉。如何获得DATEDIFF的总和,但如果指定的单日

话虽这么说,这里是我的问题:

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

现在,我想获得的机器闲置的时间的总和。现在,我明白了这一点,但是,一些idle_times比24小时更长。

所以,当我指定我只希望看到一个特别的日子的IDLE_TIME总和,总和也算空闲时间过去24小时。

我想提供的在24小时切断的选项。这可能吗?

下面是该查询:

{}代码

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 

随意忽略破折号标志着往上顶。请告诉我是否可以更具体地说明这一点,并为那些愿意帮助我的人提供更少的麻烦。

非常感谢!

+1

任何机会,你能之间的所有空闲时间使用示例数据将它变成[SQL小提琴](http://sqlfiddle.com/)?(如果你能这样做,更有可能让你的问题第一次正确回答......) –

+1

欢迎来到Stack Overflow!您正在使用哪个[DBMS](http://en.wikipedia.org/wiki/Database)*(MySQL,Oracle,...)*? –

+0

我目前在MySQL工作,我正在使用的程序是SQLyog –

回答

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' 
1

这不是为了回答你的问题。这是作为一个答案而不是一个更好的格式和可读性的评论。

您在WHERE子句中有这样的

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.time_start >= a date value goes here 
AND re.time_start <= another date value goes here 
+0

谢谢!今天学到了东西:) (现在...仍然认为这个讨厌的问题) –

1

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

可以使用的情况下进行调整根据您的时间安排,例如for 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 time_start < timestamp '2013-08-19 00:00:00' 
    and time_end >= timestamp '2013-08-12 00:00:00' 

这将返回2013年8月12日和2013年8月18日