2016-05-17 96 views
2

我需要幫助,我需要計算在以前結束日期和當前事件的開始日期分鐘之間的差別,根據系統行。Mysql的計算分鐘記錄

這是表:

id |system |start |end | ------------------------------------------------------------ 2 | system 1 | 2016-01-01 12:00:00 | 2016-01-01 13:00:00 | ------------------------------------------------------------ 3 | system 1 | 2016-01-02 11:00:00 | 2016-01-02 12:00:00 | ------------------------------------------------------------ 5 | system 1 | 2016-01-03 15:00:00 | 2016-01-03 16:00:00 | ------------------------------------------------------------ 6 | system 2 | 2016-01-01 10:00:00 | 2016-01-01 11:00:00 | ------------------------------------------------------------ 7 | system 2 | 2016-01-02 17:00:00 | 2016-01-02 18:00:00 |

這是結果:

與ID 2和6,這兩個系統的記錄有「結束日期」的沒有事先記錄,以使減法:

id | system | diff_min | --------------------------------- 2 | system 1 | 0 | --------------------------------- 3 | system 1 | 1380 | --------------------------------- 5 | system 1 | 1620 | --------------------------------- 6 | system 2 | 0 | --------------------------------- 7 | system 2 | 1800 | ---------------------------------

+0

是這樣的結果正確的最後兩列? '3 |系統1 | 1380'。它不應該是這樣的系統嗎?1 \t 1320'? – 1000111

+0

僅用於示例的近似值。 –

回答

0

下面的查詢做到這一點:

SELECT 
    id, 
    system, 
    IF (@previousSystem = system, TIMESTAMPDIFF(MINUTE ,@previousEndTime,start), 
     @previousEndTime := 0) diff_min, 
    @previousSystem := system, 
    @previousEndTime := end 
FROM 
    system_table, 
    (
     SELECT 
      @previousSystem := NULL, 
      @previousEndTime := '0000-00-00 00:00:00' 
    ) var 
ORDER BY system, id; 

輸出:

運行在你給出的數據上面的查詢,你會得到一個輸出如下:

id system  diff_min 
2 system 1 0 
3 system 1 1320 
5 system 1 1620 
6 system 2 0 
7 system 2 1800 

SQL FIDDLE

請忽略結果集中我的查詢

+0

尊敬的1000111,我嘗試了這種可能的解決方案,但是我得到了具有上一次結束時間的系統的diff_min列中的空值。 –

+0

請立即檢查。我編輯了我的答案,並添加了小提琴。 @GermánRojas – 1000111

+0

改變是否奏效? @GermánRojas – 1000111

0

您可以使用兩個內置函數

01實現這一目標
select id, system, TIMESTAMPDIFF(MINUTE, endDate, startDate) diff_min 

select id, system, TIMEDIFF(endDate, startDate)/60 as diff_min 
0
select id,system,TIMESTAMPDIFF(MINUTE,end,start) as diff_min from table_name;