Problem:
Du har två kolumner av typen tidsstämpel och du vill beräkna skillnaden mellan dem.
Exempel:
I travel
tabell, det finns tre kolumner:id
, departure
och arrival
. Du vill beräkna skillnaden mellan arrival
och departure
.
travel
tabellen ser ut så här:
id | avgång | ankomst |
---|---|---|
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ösning 1 (skillnad i dagar, timmar, minuter eller sekunder):
VÄLJ id, avgång, ankomst, TIMESTAMPDIFF(SECOND, avgång, ankomst) SOM skillnad FROM resa;
Resultatet är:
id | avgång | ankomst | skillnad |
---|---|---|---|
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:
För att beräkna skillnaden mellan tidsstämplarna i MySQL, använd TIMESTAMPDIFF(unit, start, end)
fungera. Enhetsargumentet kan vara MICROSECOND
, SECOND
, MINUTE
, HOUR
, DAY
, WEEK
, MONTH
, QUARTER
, eller YEAR
. För att få skillnaden i sekunder som vi har gjort här, välj SECOND
. För att få skillnaden i minuter, välj MINUTE
; för skillnaden i timmar, välj HOUR
, etc. Argumenten för slut och start är sluttidsstämpeln respektive starttidsstämpeln (här departure
och arrival
, respectively
).
Lösning 2 (skillnad i dagar, timmar, minuter och sekunder):
WITH difference_in_seconds AS ( VÄLJ id, avgång, ankomst, TIMESTAMPDIFF(SECOND, avgång, ankomst) AS sekunder FRÅN resa), skillnader AS ( SELECT id, avgång, ankomst, sekunder, MOD(sekunder, 60) AS sekunder_del, MOD (sekunder, 3600) AS minutes_part, MOD(sekunder, 3600 * 24) AS hours_part FROM difference_in_seconds)SELECT id, departure, arrival, CONCAT( FLOOR(seconds / 3600 / 24), ' days ', FLOOR(hours_part / ), ' timmar ', FLOOR(minuter_del / 60), ' minuter ', sekunder_del, ' sekunder' ) SOM skillnad FROM skillnader;
Resultatet är:
id | avgång | ankomst | skillnad |
---|---|---|---|
1 | 2018-03-25 12:00:00 | 2018-04-05 07:30:00 | 10 dagar 19 timmar 30 minuter 0 sekunder |
2 | 2019-09-12 15:50:00 | 2019-10-23 10:30:30 | 40 dagar 18 timmar 40 minuter 30 sekunder |
3 | 2018-07-14 16:15:00 | 2018-07-14 20:40:30 | 0 dagar 4 timmar 25 minuter 30 sekunder |
4 | 2018-01-05 08:35:00 | 2019-01-08 14:00:00 | 368 dagar 5 timmar 25 minuter 0 sekunder |
Diskussion:
Beräkna först skillnaden mellan tidsstämplarna i sekunder med hjälp av TIMESTAMPDIFF()
funktion (den första CTE, som heter difference_in_seconds
), precis som i lösning 1. Beräkna hur många sekunder det finns över hela minuter (seconds_part
) för att användas senare för att beräkna sekunderna, hur många sekunder det finns över hela timmar (minutes_part
) för att användas senare för att beräkna minuterna och hur många sekunder det finns över hela timmar (hours_part
) för att användas senare för att beräkna timmarna.
För att göra detta, använd MOD()
fungera. Till exempel har en timme 3600 sekunder, så för att ta reda på hur många sekunder det finns i minutes_part
, hitta resten från divisionen med 3600 så här:
MOD(seconds, 3600) AS minutes_part
På samma sätt finns det 3600 * 24
sekunder på en dag, så för att beräkna hur många sekunder det finns i hours_part
, skriv:
MOD(seconds, 3600 * 24) AS hours_part
När dessa rester har beräknats (i den andra CTE, benämnd differences
), kan du äntligen få skillnaden i dagar, timmar, minuter och sekunder. För att få antalet sekunder, minuter, timmar och dagar, dividera antalet sekunder i resten med motsvarande antal sekunder i dagar, timmar eller minuter. Till exempel, för att ta reda på hur många minuter som ska visas, ta minutes_part
och dividera det med 60, eftersom det går 60 minuter på en timme. Du behöver bara heltalsdelen från denna (dvs utan decimaldelen), så använd FLOOR()-funktionen så här:
FLOOR(minutes_part / 60)
Slutligen behöver du bara visa i en sträng vad du har beräknat. För att göra detta, använd CONCAT()
funktion i den yttre frågan:
CONCAT( FLOOR(sekunder / 3600 / 24), ' dagar ', FLOOR(timmar_del / 3600), ' timmar ', FLOOR(minuter_del / 60), ' minuter ', sekunder_del, ' sekunder' ) SOM skillnadLösningen som presenteras här returnerar den sista kolumnen som text. Du kan enkelt ändra denna lösning för att visa den i något annat format. Du kan också visa siffrorna i separata kolumner, så här:
FLOOR(seconds / 3600 / 24) AS days,FLOOR(hours_part / 3600) AS hours,FLOOR(minutes_part / 60) AS minutes,seconds_part AS seconds