我有MYSQL数据库,我想写一个查询,将返回我在秒之间的时间差DOWN和UP事件。我只需要DOWN和UP事件之间的差异,而不是UP和DOWN事件之间的差异。
下面是我的数据库记录的一个示例:
comment date_time type
146 2015-05-20 07:07:34 UP
146 2015-05-20 07:02:32 DOWN
146 2015-05-20 00:03:13 UP
146 2015-05-19 23:57:36 DOWN
所以因为我只需要DOWN和UP事件之间的差异,所以2015-05-20 00:00:00
和2015-05-20 12:00:00
之间的差异应该是00:05:02
SELECT UP1.comment, sum(timestampdiff(second, DOWN1.date_time, UP1.date_time)) AS down_time_d FROM
(SELECT comment, date_time, type FROM event
WHERE comment like '%146%'
AND event.date_time BETWEEN '2015-05-20 00:00.00' and '2015-05-20 13:23:58'
AND type = 'SENSOR_UP'
) AS UP1,
(SELECT comment, date_time, type FROM event
WHERE comment like '%146%'
AND event.date_time BETWEEN '2015-05-20 00:00.00' and '2015-05-20 13:23:58'
AND type = 'SENSOR_DOWN'
) AS DOWN1
WHERE UP1.comment=DOWN1.comment
GROUP BY comment
这个查询的问题是返回DOWN和UP之间以及UP和DOWN之间的差异。返回,我的差异是06:54:17
而不是我的期望00:05:02
。如果有更多的DOWN和UP记录,它会在DOWN和UP之间的所有可能组合之间产生差异。
我应该在我的查询中改变什么,这将返回我只有DOWN和UP事件之间的时间差的总和?
感谢您的帮助
我来解释一下你的要求…
-系统宕机的总时间
从DOWN
事件开始,系统一直处于关闭状态,直到任何后续事件。
如果后面的事件也是一个DOWN
,它只是继续保持下降。
如果没有后续事件,系统将一直处于关闭状态,直到"now"。
SELECT
comment,
SUM(down_time)
FROM
(
SELECT
down_event.comment,
TIMESTAMPDIFF(
second,
down_event.date_time,
COALESCE(
MIN(next_event.date_time),
'2015-05-20 13:23:58'
)
) AS down_time
FROM
event down_event
LEFT JOIN
event next_event
ON next_event.comment = down_event.comment
AND next_event.date_time > down_event.date_time
AND next_event.date_time BETWEEN '2015-05-20 00:00.00'
AND '2015-05-20 13:23:58'
WHERE
down_event.type = 'DOWN'
AND down_event.date_time BETWEEN '2015-05-20 00:00.00'
AND '2015-05-20 13:23:58'
GROUP BY
down_event.comment,
down_event.date_time
)
AS down_time
GROUP BY
comment
;