2017-04-03 43 views
0

我有以下表結構:Mysql的TIMESTAMPDIFF總和

+----+---------------------+---------------------+ 
| id | created_at   | closed    | 
+----+---------------------+---------------------+ 
| 1 | 2017-04-03 04:00:00 | 2017-04-03 04:30:00 | 
| 2 | 2017-04-03 04:25:00 | 2017-04-03 04:35:00 | 
+----+---------------------+---------------------+ 

在我真正的SQL查詢我用timestampdiff到clacualte在timestap場兩個日期之間的diffirence。沒有如果ctreated_at和所有記錄closed_at開始向度的時間間隔問題,所以我就能夠得到消耗的所有行時間如下:

SELECT SUM(timestampdiff(SECOND, created_at, closed_at)) as TotalTime FROM table 

我的問題是像上面顯示的表,時間間隔穿越。上面的查詢將導致900但我應該有600

我已經試過類似:

SELECT timestampdiff(
        MINUTE, 
        a.created_at, 
        (SELECT max(b.closed) from times as b WHERE b.created_at < a.closed) 
        ) as periods 
FROM `times` as a 

結果是:

+---------+ 
| periods | 
+---------+ 
|  35 | 
|  10 | 
+---------+ 

在這裏,我想只有第一個結果whuch represnts的重疊期間的淨時間。使用MAX與以前的查詢應返回的第一條記錄,但它會導致忽視在futere添加任何其他時段組認爲該表變爲:

+----+---------------------+---------------------+ 
| id | created_at   | closed    | 
+----+---------------------+---------------------+ 
| 1 | 2017-04-03 04:00:00 | 2017-04-03 04:30:00 | 
| 2 | 2017-04-03 04:25:00 | 2017-04-03 04:35:00 | 
| 3 | 2017-04-03 05:00:00 | 2017-04-03 05:15:00 | 
+----+---------------------+---------------------+ 

上面的查詢返回:

+---------+ 
| periods | 
+---------+ 
|  35 | 
|  10 | 
|  15 | 
+---------+ 

再次在這裏,我不想要第二條記錄,因爲它描述了之前計入第一條記錄的期間。事實上,我不知道是否有可能在MySQL中獲得(僅用於上面的例子)只有兩條記錄甚至三條記錄,但第二條是null,0,負值等可以與其他真正的值區分開來。

+0

我認爲這是不可能在MySQL中。 –

回答

0

您需要按小時計算時間分組,並且最多不超過1小時。

SELECT max(timestampdiff(
        MINUTE, 
        a.created_at,closed) as periods 
FROM `times` as a group by hour(created_at) 

現在你將得到你所需要的結果。

+1

此解決方案有效,但在另一個獨立間隔發生在第一個小時的同一小時時有限制。假設表的第三行有'created_at',值爲'2017-04-03 04:55:00' – SaidbakR

+0

那時你想得到什麼? – Rams

+0

它並不侷限於特定的時間,這個想法就像事件日誌表一樣,我想要確定重疊期間事件所用的時間段,以及其他獨立時間段也有次時間段。 @Rams – SaidbakR