MYSQL中向下和向上事件之间的时间戳差异,而不是向上和向下事件之间的时间戳差异
我有一个MYSQL数据库,我想写一个查询,它将以秒为单位返回DOWN和UP事件之间的时差。我只需要上下项目之间的差异,而不需要上下项目之间的差异 以下是我的数据库记录示例:MYSQL中向下和向上事件之间的时间戳差异,而不是向上和向下事件之间的时间戳差异,mysql,sql,mysql-workbench,Mysql,Sql,Mysql Workbench,我有一个MYSQL数据库,我想写一个查询,它将以秒为单位返回DOWN和UP事件之间的时差。我只需要上下项目之间的差异,而不需要上下项目之间的差异 以下是我的数据库记录示例: 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:
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
因此,因为我只需要向下和向上事件之间的差异,所以2015-05-20 00:00:00
和2015-05-20 12:00:00
之间的差异应该是00:05:02
我有一个MYSQL查询:
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与DOWN之间的差异。返回我的差异是06:54:17
,而不是我的期望值00:05:02
。如果有更多的向下和向上记录,那么向下和向上之间所有可能的组合都会有所不同
我应该在我的查询中更改什么,只返回向下和向上事件之间的时差之和
Thanx寻求帮助我要解释一下你的要求……
-系统关闭的总时间 系统从<代码>下降事件开始下降,直到任何后续事件结束 如果随后的事件也是一个
下降
,它只是继续下降
如果没有后续事件,系统将保持关闭状态,直到“现在”
您不能将表结构修改为包含
senser\u up date\u time、sensor\u down date\u time
列吗?因此,每个事件在同一记录中都有向上
和向下
时间!!我的想法是一样的,但是我想添加第四列up_down_event_id,它将链接两个up_down记录。问题是,这肯定有简化的余地。当然,事件id应该设置。这个数据源是如何组织的?例如,事件顺序是否可以是向上、向上、向下、向下、向上?应该如何满足这些需求呢?这样的解决方案会很好,而且会大大简化事情,但数据库结构就是这样,不可能改变任何东西。所以我需要用这类数据找到一个解。查找ID是不可能的,因为有更多的注释类型(146、145、144、143等),并且它们都有向下和向上事件。所以ID1000代表commetn 146,ID1001代表145,ID1002代表146…没有键将ID与注释或日期时间连接起来。ID只是事件的随机数,无论该事件属于哪种注释类型。一定有办法用这些数据来解决这个问题?首先我感谢你的回答。我实际解决了系统在午夜和上下之间停机的问题,现在是PHP。这里我只需要事件下降和上升之间的时间差(以秒为单位)。
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
;