2012-07-20 74 views
3

假設我有一個帶有報警系統日誌的數據庫。間隔時間會插入數據庫中的新行。該行具有alarm_id,一個日期時間和一個標誌,用於報警是打開還是關閉。MySql:計數間隔

我想知道一段時間(今天,本週,本月)警報設置爲開啓(武裝= 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至0點29分58秒=> 19點58分鐘武裝。 從1:00:00到1:20:00佈防=> 20分鐘。爲了這一天,警報已經持續了至少39:58分鐘,這必須是我的查詢結果。

日誌就像一個心跳,所以警報可以在「開」和「關」狀態之間進行佈防,但我只想知道隨後的行佈防= 1。

我一直在爲此而感到頭疼。我自己加入了桌子,但我無法弄清楚如何做到這一點。它甚至有可能嗎? 我已經設置了一個SQL小提琴玩數據:http://sqlfiddle.com/#!2/9eca2/2/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; 
+0

謝謝您的查詢。它確實給出了一個有趣的結果。我更新了SQL小提琴:http://sqlfiddle.com/#!2/9eca2/26 從這個查詢中獲得總數(39:58)仍然很困難。你不能只計算/總結'時間'值的總和。是否有可能在純SQL中獲得結果? – user1540127 2012-07-26 06:57:31

+0

我更新了新的查詢,只是嘗試它。它會給你準確的結果爲39:58 – Omesh 2012-07-26 09:23:31

+0

這似乎很棒。編輯/嘗試它時我犯了錯誤嗎?在SQL小提琴它給我1:19:56:http://sqlfiddle.com/#!2/9eca2/37 我只更改列'adate'到日期以匹配表中的列。 非常感謝您的幫助。 :) – user1540127 2012-07-26 16:10:52