假设我有一个包含警报系统日志的数据库。使用间隔,将插入数据库中的新行。此行包含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
感谢。
答案 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;