MySql:计算间隔

时间:2012-07-20 08:42:44

标签: mysql sql datetime

假设我有一个包含警报系统日志的数据库。使用间隔,将插入数据库中的新行。此行包含alarm_id,日期时间以及警报是打开还是关闭的标志。

我想知道在一段时间内(今天,本周,本月)闹钟被设定为多久(武装= 1)。那将是武装= 1的后续行。如果有一个装备值= 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分钟,这必须是我查询的结果。

日志就像一个心跳,因此警报可以在“开”和“关”状态之间布防,但我只想知道后续行是什么设置= 1。

我一直在为此而烦恼。我自己加入了桌子,但我无法弄清楚如何做到这一点。它甚至可能吗? 我已经设置了一个SQL小提琴来播放数据:http://sqlfiddle.com/#!2/9eca2/2/0

感谢。

1 个答案:

答案 0 :(得分:2)

你必须使用这样的东西在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;