Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So berechnen Sie den Unterschied zwischen zwei Zeitstempeln in MySQL

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 Differenz 

Die 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