2015-06-14 17 views
1

我有一個表的結構是這樣計算時間差在MySQL,但考慮事件兼顧

index - date ------ time ----- status 
1  2015-01-01 13:00:00 start 
2  2015-01-01 13:10:00 continue 
3  2015-01-01 13:20:00 continue 
4  2015-01-01 13:30:00 end 
5  2015-01-01 13:30:00 ready 
6  2015-01-01 13:40:00 start 
7  2015-01-01 13:50:00 continue 
8  2015-01-01 15:00:00 end 

什麼,我想這樣做是計數的開始和結束的時間(即指數1-4 30分鐘,6-8分鐘爲20分鐘),但僅考慮第一次開始和第一次結束,以便查詢不選擇索引1-8的時間差。哪個查詢用於計算兩個雕像之間的時間差異(開始 - 結束),並顯示多個開始 - 結束實例的結果,而不將它們批量合併到一個事件中?

+0

一般情況下,這是最好的存儲日期和時間作爲一個單一的日期時間實體。 – Strawberry

+0

爲什麼6-7(這是10分鐘BTW)? – Strawberry

+0

在開始/結束之間有多個「繼續」時間戳,添加傳感器值,該值位於另一列中,但與問題沒有直接關係。 – Fid

回答

1

對於每次開始,請使用查詢來獲取下一個結束時間。然後,只需計算差異。其中的邏輯是這樣的:

select t.*, timestampdiff(second, dt, next_dt) 
from (select t.*, addtime(t.date, t.time) as dt, 
      (select addtime(t2.date, t2.time) 
       from table t2 
       where addtime(t2.date, t2.time) > addtime(t.date, t.time) and 
        status = 'end' 
       order by addtime(t2.date, t2.time) desc 
       limit 1 
      ) as next_dt 
     from table t 
     where status = 'start' 
    ) t 

這是假設你的日期和時間列使用了正確的數據庫類型(datetime)存儲。如果您將它們存儲爲其他內容,則必須不必要地將邏輯複雜化,才能將它們轉換爲內部格式。

+0

謝謝!我會試試這個。我已經修正了上面例子中的格式,這些字段確實是真實數據庫中的日期/時間格式。 – Fid

+0

最後一個括號後的't'代表什麼?數據庫表名稱? – Fid

+0

@Fid。 。 。它是一個表別名,並且是MySQL(和其他一些數據庫)中的子查詢所必需的。 –

2

考慮以下...

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,dt DATETIME NOT NULL 
,status VARCHAR(12) NOT NULL 
); 

INSERT INTO my_table VALUES 
(1  ,'2015-01-01 13:00:00' , 'start'), 
(2  ,'2015-01-01 13:10:00' , 'continue'), 
(3  ,'2015-01-01 13:20:00' , 'continue'), 
(4  ,'2015-01-01 13:30:00' , 'end'), 
(5  ,'2015-01-01 13:30:00' , 'ready'), 
(6  ,'2015-01-01 13:40:00' , 'start'), 
(7  ,'2015-01-01 13:50:00' , 'continue'), 
(8  ,'2015-01-01 15:00:00' , 'end'); 

SELECT x.* 
    , TIMEDIFF(MIN(y.dt),x.dt)diff 
    FROM my_table x 
    JOIN my_table y 
    ON y.dt >= x.dt 
WHERE x.status = 'start' 
    AND y.status = 'end' 
GROUP 
    BY x.id; 
+----+---------------------+--------+----------+ 
| id | dt     | status | diff  | 
+----+---------------------+--------+----------+ 
| 1 | 2015-01-01 13:00:00 | start | 00:30:00 | 
| 6 | 2015-01-01 13:40:00 | start | 01:20:00 | 
+----+---------------------+--------+----------+