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