Problem:
Sie haben zwei Spalten vom Typ timestamp und möchten die Differenz zwischen ihnen berechnen.
Beispiel:
Im travel
Tabelle gibt es drei Spalten:id
, departure
, und arrival
. Sie möchten die Differenz zwischen der arrival
berechnen und die departure
.
Die travel
Tabelle sieht so aus:
id | Abfahrt | Ankunft |
---|---|---|
1 | 2018-03-25 12:00:00 | 2018-04-05 07:30:00 |
2 | 2019-09-12 15:50:00 | 2019-10-23 10:30:30 |
3 | 2018-07-14 16:15:00 | 2018-07-14 20:40:30 |
4 | 2018-01-05 08:35:00 | 2019-01-08 14:00:00 |
Lösung 1 (Unterschied in Tagen, Stunden, Minuten oder Sekunden):
SELECT ID, Abfahrt, Ankunft, TIMESTAMPDIFF(SECOND, Abfahrt, Ankunft) AS differenceFROM travel;
Das Ergebnis ist:
id | Abfahrt | Ankunft | Unterschied |
---|---|---|---|
1 | 2018-03-25 12:00:00 | 2018-04-05 07:30:00 | 934200 |
2 | 2019-09-12 15:50:00 | 2019-10-23 10:30:30 | 3523230 |
3 | 2018-07-14 16:15:00 | 2018-07-14 20:40:30 | 15930 |
4 | 2018-01-05 08:35:00 | 2019-01-08 14:00:00 | 31814700 |
Diskussion:
Um die Differenz zwischen den Zeitstempeln in MySQL zu berechnen, verwenden Sie TIMESTAMPDIFF(unit, start, end)
Funktion. Das Einheitenargument kann MICROSECOND
sein , SECOND
, MINUTE
, HOUR
, DAY
, WEEK
, MONTH
, QUARTER
, oder YEAR
. Um den Unterschied in Sekunden zu erhalten, wie wir es hier getan haben, wählen Sie SECOND
. Um die Differenz in Minuten zu erhalten, wählen Sie MINUTE
; für die Differenz in Stunden wählen Sie HOUR
usw. Das End- und das Startargument sind der Endzeitstempel bzw. der Startzeitstempel (hier departure
und arrival
, respectively
).
Lösung 2 (Unterschied in Tagen, Stunden, Minuten und Sekunden):
MIT Differenz_in_Sekunden AS ( SELECT id, Abfahrt, Ankunft, TIMESTAMPDIFF(SECOND, Abfahrt, Ankunft) AS Sekunden FROM Reise),Unterschiede AS ( SELECT id, Abfahrt, Ankunft, Sekunden, MOD(Sekunden, 60) AS Sekunden_Teil, MOD (Sekunden, 3600) AS Minuten_Teil, MOD(Sekunden, 3600 * 24) AS Stunden_Teil FROM Differenz_in_Sekunden)SELECT ID, Abflug, Ankunft, CONCAT( FLOOR(Sekunden / 3600 / 24), 'Tage', FLOOR(Stunden_Teil / 3600), ' Stunden ', FLOOR(Minuten_Teil / 60), ' Minuten ', Sekunden_Teil, ' Sekunden' ) AS differenceFROM Differenzen;
Das Ergebnis ist:
id | Abfahrt | Ankunft | Unterschied |
---|---|---|---|
1 | 2018-03-25 12:00:00 | 2018-04-05 07:30:00 | 10 Tage 19 Stunden 30 Minuten 0 Sekunden |
2 | 2019-09-12 15:50:00 | 2019-10-23 10:30:30 | 40 Tage 18 Stunden 40 Minuten 30 Sekunden |
3 | 2018-07-14 16:15:00 | 2018-07-14 20:40:30 | 0 Tage 4 Stunden 25 Minuten 30 Sekunden |
4 | 2018-01-05 08:35:00 | 2019-01-08 14:00:00 | 368 Tage 5 Stunden 25 Minuten 0 Sekunden |
Diskussion:
Berechnen Sie zuerst die Differenz zwischen den Zeitstempeln in Sekunden, indem Sie TIMESTAMPDIFF()
verwenden Funktion (der erste CTE mit dem Namen difference_in_seconds
), genau wie in Lösung 1. Berechnen Sie, wie viele Sekunden ganze Minuten überschreiten (seconds_part
), um später die Sekunden zu berechnen, wie viele Sekunden die ganzen Stunden überschreiten (minutes_part
), um später die Minuten zu berechnen, und wie viele Sekunden die ganzen Stunden überschreiten (hours_part
), um später die Stunden zu berechnen.
Verwenden Sie dazu den MOD()
Funktion. Zum Beispiel hat eine Stunde 3600 Sekunden, um herauszufinden, wie viele Sekunden in minutes_part
sind , finden Sie den Rest der Division durch 3600 wie folgt:
MOD(seconds, 3600) AS minutes_part
Ebenso gibt es 3600 * 24
Sekunden an einem Tag, um zu berechnen, wie viele Sekunden in hours_part
sind , schreiben Sie:
MOD(seconds, 3600 * 24) AS hours_part
Sobald diese Reste berechnet sind (im zweiten CTE mit dem Namen differences
), können Sie endlich die Differenz in Tagen, Stunden, Minuten und Sekunden ermitteln. Um die Anzahl der Sekunden, Minuten, Stunden und Tage zu erhalten, dividieren Sie die Anzahl der Sekunden im Rest durch die entsprechende Anzahl der Sekunden in Tagen, Stunden oder Minuten. Um beispielsweise herauszufinden, wie viele Minuten angezeigt werden sollen, nehmen Sie minutes_part
und teile es durch 60, da eine Stunde 60 Minuten hat. Sie benötigen davon nur den ganzzahligen Teil (d. h. ohne den Dezimalteil), also verwenden Sie die FLOOR()-Funktion wie folgt:
FLOOR(minutes_part / 60)
Schließlich müssen Sie einfach in einer Zeichenfolge anzeigen, was Sie berechnet haben. Verwenden Sie dazu den CONCAT()
Funktion in der äußeren Abfrage:
CONCAT( FLOOR(seconds / 3600 / 24), 'days', FLOOR(hours_part / 3600), 'hours', FLOOR(minutes_part / 60), 'minutes', second_part, 'seconds' ) AS DifferenzDie hier vorgestellte Lösung gibt die letzte Spalte als Text zurück. Sie können diese Lösung einfach ändern, um sie in einem anderen Format anzuzeigen. Sie können die Zahlen auch wie folgt in separaten Spalten anzeigen:
FLOOR(seconds / 3600 / 24) AS Tage,FLOOR(hours_part / 3600) AS Stunden,FLOOR(minutes_part / 60) AS Minuten,seconds_part AS Sekunden