sql >> Databasteknik >  >> RDS >> Mysql

Hur man beräknar skillnaden mellan två tidsstämplar i MySQL

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 skillnad 

Lö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

  1. Hur funktionen tidszon() fungerar i PostgreSQL

  2. Viloläge UUID med PostgreSQL och SQL Server

  3. Är det möjligt att referera till kolumnnamn via bindningsvariabler i Oracle?

  4. Hur spolar jag till en CSV-formaterad fil med SQLPLUS?