sql >> Database >  >> RDS >> Mysql

Hoe het verschil tussen twee tijdstempels in MySQL te berekenen?

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

  1. Wat is de beste manier om te bepalen welke versie van de Oracle-client ik gebruik?

  2. Aanmeldingsstroom in R12.2 en eenvoudige probleemoplossing

  3. Database Performance Tuning voor MariaDB

  4. 2 manieren om alle databases in PostgreSQL (psql) te tonen