Probleem:
Je hebt twee kolommen van het type datetime
en u wilt het verschil ertussen berekenen.
Voorbeeld:
In de travel
tabel, zijn er drie kolommen:id
, departure
, en arrival
. U wilt het verschil berekenen tussen de arrival
en de departure
.
De travel
tabel ziet er als volgt uit:
id | vertrek | aankomst |
---|---|---|
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 |
Oplossing 1 (verschil in seconden):
SELECT id, departure, arrival, DATEDIFF(second, departure, arrival) AS difference FROM travel;
Het resultaat is:
id | vertrek | aankomst | verschil |
---|---|---|---|
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 |
Discussie:
Om het verschil te berekenen tussen de arrival
en het vertrek in T-SQL, gebruik de DATEDIFF(datepart, startdate, enddate)
functie. Het datepart
argument kan microsecond
zijn , second
, minute
, hour
, day
, week
, month
, quarter
, of year
. Hier wil je het verschil in seconden zien, dus kies de tweede. Om het verschil in uren te krijgen, kies hour
; voor het verschil in maanden, kies month
, enz. De startdate
en de enddate
argumenten zijn het begin en het einde datetime
kolommen, respectievelijk (hier, departure
en arrival
, respectievelijk).
Oplossing 2 (verschil in dagen, uren, minuten en seconden):
WITH difference_in_seconds AS ( SELECT id, departure, arrival, DATEDIFF(SECOND, departure, arrival) AS seconds FROM travel ), differences AS ( SELECT id, departure, arrival, seconds, seconds % 60 AS seconds_part, seconds % 3600 AS minutes_part, seconds % (3600 * 24) AS hours_part FROM difference_in_seconds ) SELECT id, departure, arrival, CONCAT( FLOOR(seconds / 3600 / 24), ' days ', FLOOR(hours_part / 3600), ' hours ', FLOOR(minutes_part / 60), ' minutes ', seconds_part, ' seconds' ) AS difference FROM differences;
Het resultaat is:
id | vertrek | aankomst | verschil |
---|---|---|---|
1 | 2018-03-25 12:00:00 | 2018-04-05 07:30:00 | 10 dagen 19 uur 30 minuten 0 seconden |
2 | 2019-09-12 15:50:00 | 2019-10-23 10:30:30 | 40 dagen 18 uur 40 minuten 30 seconden |
3 | 2018-07-14 16:15:00 | 2018-07-14 20:40:30 | 0 dagen 4 uur 25 minuten 30 seconden |
4 | 2018-01-05 08:35:00 | 2019-01-08 14:00:00 | 368 dagen 5 uur 25 minuten 0 seconden |
Discussie:
Bereken eerst het verschil tussen de arrival
en de departure
in seconden, met behulp van de DATEDIFF()
functie (de eerste CTE, genaamd difference_in_seconds
), net als in Oplossing 1. Bereken vervolgens hoeveel seconden er meer zijn dan hele minuten (seconds_part
) om later te gebruiken om de seconden te berekenen, hoeveel seconden er meer zijn dan hele uren (minutes_part
) om later te gebruiken om de minuten te berekenen, en hoeveel seconden er meer zijn dan hele uren (hours_part
) om later te gebruiken om de uren te berekenen.
Gebruik hiervoor de %-operator. Een uur heeft bijvoorbeeld 3600 seconden, dus om te zien hoeveel seconden er zijn in minutes_part
, vind de rest van de deling door 3600 als volgt:
seconds % 3600 AS minutes_part
Evenzo zijn er 3600 * 24
seconden in een dag, dus om te berekenen hoeveel seconden er zijn in hours_part
, schrijf:
seconds % (3600 * 24) AS hours_part
Zodra deze restanten zijn berekend (in de tweede CTE, genaamd differences
), kunt u eindelijk het verschil in dagen, uren, minuten en seconden krijgen. Om het aantal seconden, minuten, uren en dagen te krijgen, deelt u het aantal seconden in de rest door het overeenkomstige aantal seconden in dagen, uren of minuten. Als u bijvoorbeeld wilt weten hoeveel minuten moeten worden weergegeven, neemt u minutes_part
en deel het door 60, aangezien een uur 60 minuten heeft. Je hebt alleen het gehele deel hiervan nodig (d.w.z. zonder het decimale deel), dus gebruik de FLOOR()
functioneren als volgt:
FLOOR(minutes_part / 60)
Ten slotte hoeft u alleen maar in één reeks weer te geven wat u hebt berekend. Gebruik hiervoor de CONCAT()
functie in de buitenste vraag:
CONCAT( FLOOR(seconds / 3600 / 24), ' days ', FLOOR(hours_part / 3600), ' hours ', FLOOR(minutes_part / 60), ' minutes ', seconds_part, ' seconds' ) AS difference
De hier gepresenteerde oplossing retourneert een datetime
verschil als tekst. U kunt de oplossing eenvoudig wijzigen om alleen de cijfers zonder tekst te krijgen. U kunt ook dagen, uren, minuten en seconden in verschillende kolommen opslaan:
FLOOR(seconds / 3600 / 24) AS days, FLOOR(hours_part / 3600) AS hours, FLOOR(minutes_part / 60) AS minutes, seconds_part AS seconds