Database
 sql >> Datenbank >  >> RDS >> Database

So berechnen Sie die Differenz zwischen zwei Datetimes in T-SQL

Problem:

Sie haben zwei Spalten vom Typ datetime und Sie 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 Sekunden):

SELECT ID, Abfahrt, Ankunft, DATEDIFF(Sekunde, 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 der arrival zu berechnen und die Abfahrt in T-SQL verwenden Sie den DATEDIFF(datepart, startdate, enddate) Funktion. Der datepart Argument kann microsecond sein , second , minute , hour , day , week , month , quarter , oder year . Hier möchten Sie den Unterschied in Sekunden erhalten, also wählen Sie Sekunde. Um die Differenz in Stunden zu erhalten, wählen Sie hour; für die Differenz in Monaten wählen Sie month usw. Das startdate und das enddate Argumente sind der Anfang und das Ende datetime Spalten (hier departure und arrival , bzw.).

Lösung 2 (Unterschied in Tagen, Stunden, Minuten und Sekunden):

MIT Differenz_in_Sekunden AS ( SELECT id, Abfahrt, Ankunft, DATEDIFF(SECOND, Abfahrt, Ankunft) AS Sekunden FROM Reise),Unterschiede AS ( SELECT id, Abfahrt, Ankunft, Sekunden, Sekunden % 60 AS Sekunden_Teil, Sekunden % 3600 AS Minuten_Teil, 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 der arrival und die departure in Sekunden mit DATEDIFF() Funktion (der erste CTE mit dem Namen difference_in_seconds ), genau wie in Lösung 1. Berechnen Sie dann, wie viele Sekunden die ganzen 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 %-Operator. 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:

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:

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 den FLOOR() funktionieren so:

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 ein datetime zurück Unterschied als Text. Sie können die Lösung leicht ändern, um nur die Zahlen ohne Text zu erhalten. Sie können auch Tage, Stunden, Minuten und Sekunden in verschiedenen Spalten speichern:

FLOOR(seconds / 3600 / 24) AS Tage,FLOOR(hours_part / 3600) AS Stunden,FLOOR(minutes_part / 60) AS Minuten,seconds_part AS Sekunden