sql >> Database >  >> RDS >> Database

Hoe het verschil tussen twee datums in T-SQL te berekenen

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

  1. Een lijst met triggers retourneren in SQL Server

  2. Hoe de lijst bijwerken en verwijderen Gegevens weergeven in SQLite-database met kliklistener?

  3. Kan geen verbinding maken met heroku postgresql-database vanuit de lokale node-app met sequelize

  4. Welke is het snelst? SELECT SQL_CALC_FOUND_ROWS FROM `table`, of SELECT COUNT(*)