Probleem:
U heeft twee kolommen van het type timestamp en u wilt het verschil daartussen 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 dagen, uren, minuten of seconden):
SELECT id, departure, arrival, TIMESTAMPDIFF(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 tussen de tijdstempels in MySQL te berekenen, gebruikt u de TIMESTAMPDIFF(unit, start, end)
functie. Het eenheidsargument kan MICROSECOND
. zijn , SECOND
, MINUTE
, HOUR
, DAY
, WEEK
, MONTH
, QUARTER
, of YEAR
. Om het verschil in seconden te krijgen, zoals we hier hebben gedaan, kiest u SECOND
. Om het verschil in minuten te zien, kies MINUTE
; kies voor het verschil in uren HOUR
, etc. Het eind- en het startargument zijn respectievelijk het eindtijdstempel en het begintijdstempel (hier departure
en arrival
, respectively
).
Oplossing 2 (verschil in dagen, uren, minuten en seconden):
WITH difference_in_seconds AS ( SELECT id, departure, arrival, TIMESTAMPDIFF(SECOND, departure, arrival) AS seconds FROM travel ), differences AS ( SELECT id, departure, arrival, seconds, MOD(seconds, 60) AS seconds_part, MOD(seconds, 3600) AS minutes_part, MOD(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 tijdstempels in seconden met behulp van de TIMESTAMPDIFF()
functie (de eerste CTE, genaamd difference_in_seconds
), net als in Oplossing 1. Bereken 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 MOD()
functie. 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:
MOD(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:
MOD(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 functie FLOOR() 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 de laatste kolom als tekst. U kunt deze oplossing eenvoudig wijzigen om deze in een ander formaat weer te geven. U kunt de getallen ook in aparte kolommen weergeven, zoals dit:
FLOOR(seconds / 3600 / 24) AS days, FLOOR(hours_part / 3600) AS hours, FLOOR(minutes_part / 60) AS minutes, seconds_part AS seconds