2017-09-04 1 views
0

Ich habe eine Tabelle, die playerID zusammen mit einer startDate und endDate Spalte enthält. Dies sind Zeitstempel.Berechnen der Summe der Differenz zwischen mehreren Zeitstempeln

z.B.

playerID startDate    endDate 
1   2017-06-01 12:00:00  2017-06-01 12:05:00 
1   2017-06-01 13:30:00  2017-06-01 13:33:00 
1   2017-08-04 14:57:00  0000-00-00 00:00:00 

Ich versuche, eine Abfrage auszuführen, die Gesamtzahl der Sekunden zwischen den startDate und endDate für einen bestimmten Spieler zu bekommen. Wenn die endDate0000-00-00 00:00:00 ist, dann sollte ich die aktuelle Zeit verwenden. Hier

ist, was ich habe versucht:

select 
    IF(endDate = '0000-00-00 00:00:00', CURRENT_TIMESTAMP, endDate) as finishDate, 
    sum((startDate-finishDate)) as timeTaken 
from table where playerID=1 group by playerID 

Diese beiden Fragen hat. Ich glaube nicht, dass ich finishDate verwenden kann, da ich einen unbekannten Spaltenfehler bekomme. Ich möchte auch die Summe aller Zeilen für playerID 1

Antwort

2

MySQL hat eine praktische Funktion TIMESTAMPDIFF, die den Unterschied zwischen zwei Zeitstempeln in einer Vielzahl von Einheiten, einschließlich Sekunden berechnen kann. Wir können einfach über jeden Spieler aggregieren und die Diff der Anfangs- und Endzeitstempel summieren, indem wir einen CASE Ausdruck verwenden, um den (etwas ungeraden) Nullzeitstempel durch den aktuellen Zeitstempel zu ersetzen.

SELECT 
    playerID, 
    SUM(TIMESTAMPDIFF(SECOND, 
         startDate, 
         CASE WHEN endDate = '0000-00-00 00:00:00' 
          THEN CURRENT_TIMESTAMP ELSE endDate END)) AS timeTaken 
FROM yourTable 
GROUP BY playerID 

Editorial: Ich weiß nicht, was 0000-00-00 00:00:00 in Ihrer Tabelle tut, aber ich würde viel lieber so etwas wie NULL verwenden, um ein Ende Zeitstempel darzustellen, die nicht bekannt ist. Dies würde auch den Code ein bisschen schöner machen, z. Wir könnten das folgende verwenden, um nach einem unbekannten Endzeitstempel zu suchen:

COALESCE(endDate, CURRENT_TIMESTAMP) 
+0

Das ist großartig, vielen Dank – Chris

Verwandte Themen