MySql:计数间隔

MySql:计数间隔,mysql,sql,datetime,Mysql,Sql,Datetime,假设我有一个带有报警系统日志的数据库。每隔一段时间,在数据库中插入一个新行。此行具有报警id、日期时间和报警是开启还是关闭的标志 我想知道在今天、本周、本月的一段时间内,报警设置为on armed=1的持续时间。这将是具有armed=1的后续行。如果有一行的armed=0,则可能不计算该行 例如: id alarm_id armed date 1 1 0 2012-01-01 00:0

假设我有一个带有报警系统日志的数据库。每隔一段时间,在数据库中插入一个新行。此行具有报警id、日期时间和报警是开启还是关闭的标志

我想知道在今天、本周、本月的一段时间内,报警设置为on armed=1的持续时间。这将是具有armed=1的后续行。如果有一行的armed=0,则可能不计算该行

例如:

id      alarm_id        armed       date        
1       1               0           2012-01-01 00:00:00
2       1               1           2012-01-01 00:10:00
3       1               1           2012-01-01 00:20:10
4       1               1           2012-01-01 00:29:58
5       1               0           2012-01-01 00:40:00
6       1               1           2012-01-01 01:00:00
7       1               1           2012-01-01 01:10:00
8       1               1           2012-01-01 01:20:00
9       1               0           2012-01-01 01:30:00
在本例中,警报在00:10:00到00:29:58=>19:58分钟内启动。 从1:00:00到1:20:00=>20分钟武装起来。这一天,警报已被布设至少39:58分钟,这必须是我询问的结果

日志就像心跳一样,因此可以在on和off状态之间对警报进行防护,但我只想知道后面的行是防护的=1

我一直在为这事伤脑筋。我自己加入了这张桌子,但我就是不知道怎么做。有可能吗? 我已经设置了一个SQL小提琴来处理数据:


谢谢。

在MySQL中,您必须使用类似的方法,使用单一查询:

SELECT armed_at INTO @v FROM alarm ORDER BY armed_at LIMIT 1;

SELECT armed, TIMEDIFF(armed_at, @v), @v:=armed_at FROM alarm;
有关更多详细信息,请尝试:

SET @t =0;
SELECT armed_at INTO @v FROM alarm ORDER BY armed_at LIMIT 1;
SELECT armed, 
       IF(armed = 1, @t:=ADDTIME(TIME(TIMEDIFF(armed_at, IF(@v <> 0, @v, armed_at))), @t) , @t:=0) AS time, 
       IF(armed = 1, @v:=armed_at, @v := 0) AS v 
FROM alarm;
更新后的查询将为您提供所需的准确结果,请尝试:

SET @a=0, @d=0, @t=0;

SELECT atime
FROM (
      SELECT id, armed,
             IF((@a = 1 AND armed = 1), @t:=ADDTIME(TIME(TIMEDIFF(adate, IF(@d <> 0, @d, adate))), @t) , 0) AS atime,
             IF((@a:=armed) = 1, @d:=adate, @d := 0) AS d
      FROM alarmlog
     ) a
WHERE a.armed = 1
ORDER BY id DESC
LIMIT  1;

谢谢你的提问。它确实给出了一个有趣的结果。我已经更新了SQL FIDLE:仍然很难从这个查询中得到39:58的总数。您不能只计算“时间”值的总和。有可能在纯SQL中得到结果吗?我已经更新了新的查询,请尝试一下。它会给你准确的结果,如39:58,看起来很棒。我编辑/尝试它时出错了吗?在SQLFIDLE中,它给出了1:19:56:我只将列“adate”更改为date,以匹配表中的列。非常感谢你的帮助我认为SQL FIDLE可能不适用于这种类型的查询。看见尝试PHPMyadmin或其他MySQL客户端工具。我已经测试了这个查询,它工作得非常完美。