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 DifferenzDie 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