2010-02-10 42 views
1

我有開/關數據的一系列時間戳在表中,表示開/關狀態,或者在哪個國家「開始」MySQL查詢評估時間的東西總持續時間爲「開」

00:00:00 0 
04:00:00 1 
08:00:00 0 
09:00:00 1 
15:00:00 0 
20:00:00 1 
23:59:59 0 

我需要計算在24小時內(例如)ON狀態的總持續時間。

在此簡化示例中,總持續時間= 1是 (04:00:00-> 08:00:00,09:00:00-> 15:00:00,20:00:00-> 23: 59:59 ie 13:59:59大約14h

我無法確定這是否可以單獨在SQL中完成,或者我使用的基礎框架(django)是否需要根據返回的數據來完成此操作。如果可能的話,我顯然會傾向於讓數據庫完成繁重的工作,因爲我們可能需要在我們單獨的統計數據包中使用SQL。

我不清楚我是否可以對(比如說)選擇中的前一個或下一個元素,我是一個有信心的SQL用戶,但是無法看到從哪裏開始這個或廣義的方法,有什麼想法?

我真的很喜歡這個在一個單一的查詢,或一些其他聰明的方式來計算這個我失蹤了!

+0

首先,我會DESI gn表中的ON和OFF狀態時間在不同列上的同一行上,那麼這個任務將是微不足道的。如果這對你是不可能的,那麼你需要做大量的黑客工作才能完成它:) – 2010-02-10 15:20:36

回答

1

有在MySQL沒有row_number(),但你可以做一個雙重加入搜索上一行:

select 
    sum(case when cur.state = 0 then 0 
     else subtime(cur.timeCol, prev.timeCol) 
     end) as TotalOnTime 
from YourTable cur 
join YourTable prev 
    on prev.timeCol < cur.timeCol 
left join YourTable inbetween 
    on prev.timeCol < inbetween.timeCol 
    and inbetween.timeCol < cur.timeCol 
where inbetween.timeCol is null; 

在MySQL中,你也可以使用一個變量,在這種情況下可能是更有效的:

set @total := '00:00:00'; 
set @lasttime := '00:00:00'; 

select 
    @total := addtime(@total, case 
     when state = 0 then 0 
     when @lasttime is null then 0 
     else subtime(timeCol, @lasttime) 
     end) 
, @lasttime := timeCol 
from YourTable 
order by timeCol; 

select 'Result = ', @total; 

代碼來創建和填充測試表:

DROP TABLE IF EXISTS YourTable; 
CREATE TABLE YourTable (
    timeCol time, 
    state bit 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

insert into YourTable values ('00:00:00', 0); 
insert into YourTable values ('04:00:00', 1); 
insert into YourTable values ('08:00:00', 0); 
insert into YourTable values ('09:00:00', 1); 
insert into YourTable values ('15:00:00', 0); 
insert into YourTable values ('20:00:00', 1); 
insert into YourTable values ('23:59:59', 0); 
+0

這個查詢的複雜性讓我懷疑在代碼中而不是在SQL中這樣做是否更有效。但看起來它會起作用。 – 2010-02-10 15:25:18

+0

我想我會通過變量例子得到你要去的地方,並且我想我得到了更多的幫助。 我不熟悉@lasttime var之前的句點(「。」)前綴,這會實現什麼?我在使用這種語法時遇到了錯誤,我無法在手冊中找到它的含義。 – Aitch 2010-02-10 16:17:00

+0

@Aitch:這應該是'','逗號,爲下一列 – Andomar 2010-02-10 18:32:56