Catégories :

Fonctions de date et d’heure

DATEDIFF

Calcule la différence entre deux expressions de date, d’heure ou d’horodatage en fonction de la date ou de l’heure demandée. La fonction renvoie le résultat de la soustraction du deuxième argument et du troisième argument.

Le signe moins (-) peut également être utilisé pour soustraire des dates.

Voir aussi :

TIMEDIFF , TIMESTAMPDIFF

Syntaxe

Pour DATEDIFF

DATEDIFF( <date_or_time_part>, <date_or_time_expr1>, <date_or_time_expr2> )

Pour le signe moins

<date_expr2> - <date_expr1>

Arguments

Pour DATEDIFF :

  • partie_date_ou_heure doit être l’une des valeurs répertoriées dans Parties de date et d’heure prises en charge (par exemple month). La valeur peut être un littéral de chaîne ou peut être sans guillemets (par exemple 'month' ou month).

  • expr_date_ou_heure1, expr_date_ou_heure2 doivent être une date, une heure, un horodatage ou une expression pouvant correspondre à une date, une heure ou un horodatage. La valeur expr_date_ou_heure1 est soustraite de expr_date_ou_heure2.

Pour le signe moins :

  • date_expr1, date_expr2 doit être une date ou une expression pouvant être évaluée en tant que date. La valeur date_expr1 est soustraite de date_expr2.

Renvoie

Pour DATEDIFF :

  • Renvoie un entier représentant le nombre d’unités (secondes, jours, etc.) entre date_ou_heure_expr2 et date_ou_heure_exp1.

Pour le signe moins :

  • Renvoie un entier représentant le nombre de jours entre date_expr2 et date_expr1. (Les unités sont toujours des jours).

Notes sur l’utilisation

Pour les signes DATEDIFF et moins :

  • Les valeurs de sortie peuvent être négatives, par exemple, -12 jours.

Pour DATEDIFF :

  • expr_date_ou_heure1 et expr_date_ou_heure2 peuvent être une date, une heure ou un horodatage.

  • DATEDIFF prend en charge les années, les trimestres, les mois, les semaines, les jours, les heures, les minutes, les secondes, les millisecondes, les microsecondes et les nanosecondes.

  • partie_date_ou_heure doit être l’une des valeurs répertoriées dans Parties de date et d’heure prises en charge.

    Si partie_date_ou_heure est week (ou l’une de ses variations), la sortie est contrôlée par le paramètre de session WEEK_START. Pour plus de détails, y compris des exemples, voir Semaines civiles et jours de semaine.

  • L’unité (par exemple month) utilisée pour calculer la différence détermine quelles parties du champ DATE, TIME ou TIMESTAMP sont utilisées pour déterminer le résultat et ainsi la précision du résultat.

    Les unités plus petites ne sont pas utilisées, les valeurs ne sont donc pas arrondies. Par exemple, même si la différence entre le 1er janvier 2021 et le 28 février 2021 est plus proche de deux mois que d’un mois, ce qui suit donne un mois :

    DATEDIFF(month, '2021-01-01'::DATE, '2021-02-28'::DATE)
    

    Pour une valeur DATE :

    • year utilise uniquement l’année et ignore toutes les autres parties.

    • month utilise le mois et l’année.

    • day utilise la date entière.

    Pour une valeur TIME :

    • hour utilise uniquement l’heure et ignore toutes les autres parties.

    • minute utilise l’heure et les minutes.

    • second utilise l’heure, la minute et la seconde, mais pas les secondes fractionnées.

    • millisecond utilise l’heure, la minute, la seconde et les trois premiers chiffres des secondes fractionnées. Les secondes fractionnées ne sont pas arrondies. Par exemple, DATEDIFF(milliseconds, '00:00:00', '00:00:01.1239') renvoie 1,123 seconde, et non 1,124 seconde.

    • microsecond utilise l’heure, la minute, la seconde et les six premiers chiffres des secondes fractionnelles. Les secondes fractionnées ne sont pas arrondies.

    • nanosecond utilise l’heure, la minute, la seconde et les neuf chiffres des secondes fractionnelles.

    Pour une valeur TIMESTAMP :

    Les règles correspondent aux règles pour les types de données DATE et TIME ci-dessus. Seules l’unité spécifiée et les unités plus grandes sont utilisées.

    Pour des exemples, voir ci-dessous.

Pour le signe moins :

  • date_expr1 et date_expr2 doivent toutes deux être des dates. Les heures et les horodatages ne sont pas autorisés.

Exemples

Calculez la différence en années entre deux horodatages :

SELECT DATEDIFF(year, '2010-04-09 14:39:20'::TIMESTAMP, 
                      '2013-05-08 23:39:20'::TIMESTAMP) 
               AS diff_years;
+------------+
| DIFF_YEARS |
|------------|
|          3 |
+------------+

Calculez la différence en heures entre deux horodatages :

SELECT DATEDIFF(hour, '2013-05-08T23:39:20.123-07:00'::TIMESTAMP, 
    DATEADD(year, 2, ('2013-05-08T23:39:20.123-07:00')::TIMESTAMP)) 
               AS diff_hours;
+------------+
| DIFF_HOURS |
|------------|
|      17520 |
+------------+

Montrer comment les parties de date ont une incidence sur les calculs DATEDIFF ; démontrer également l’utilisation du signe moins pour la soustraction de la date :

SELECT column1 date_1, column2 date_2,
      DATEDIFF(year, column1, column2) diff_years,
      DATEDIFF(month, column1, column2) diff_months,
      DATEDIFF(day, column1, column2) diff_days,
      column2::DATE - column1::DATE AS diff_days_via_minus
    FROM VALUES
      ('2015-12-30', '2015-12-31'),
      ('2015-12-31', '2016-01-01'),
      ('2016-01-01', '2017-12-31'),
      ('2016-08-23', '2016-09-07');
+------------+------------+------------+-------------+-----------+---------------------+
| DATE_1     | DATE_2     | DIFF_YEARS | DIFF_MONTHS | DIFF_DAYS | DIFF_DAYS_VIA_MINUS |
|------------+------------+------------+-------------+-----------+---------------------|
| 2015-12-30 | 2015-12-31 |          0 |           0 |         1 |                   1 |
| 2015-12-31 | 2016-01-01 |          1 |           1 |         1 |                   1 |
| 2016-01-01 | 2017-12-31 |          1 |          23 |       730 |                 730 |
| 2016-08-23 | 2016-09-07 |          0 |           1 |        15 |                  15 |
+------------+------------+------------+-------------+-----------+---------------------+

Montrer comment les intervalles de temps affectent les calculs de DATEDIFF :

ALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = 'DY, DD MON YYYY HH24:MI:SS';
SELECT column1 timestamp_1, column2 timestamp_2,
      DATEDIFF(hour, column1, column2) diff_hours,
      DATEDIFF(minute, column1, column2) diff_minutes,
      DATEDIFF(second, column1, column2) diff_seconds
    FROM VALUES
      ('2016-01-01 01:59:59'::TIMESTAMP, '2016-01-01 02:00:00'::TIMESTAMP),
      ('2016-01-01 01:00:00'::TIMESTAMP, '2016-01-01 01:59:00'::TIMESTAMP),
      ('2016-01-01 01:00:59'::TIMESTAMP, '2016-01-01 02:00:00'::TIMESTAMP);
+---------------------------+---------------------------+------------+--------------+--------------+
| TIMESTAMP_1               | TIMESTAMP_2               | DIFF_HOURS | DIFF_MINUTES | DIFF_SECONDS |
|---------------------------+---------------------------+------------+--------------+--------------|
| Fri, 01 Jan 2016 01:59:59 | Fri, 01 Jan 2016 02:00:00 |          1 |            1 |            1 |
| Fri, 01 Jan 2016 01:00:00 | Fri, 01 Jan 2016 01:59:00 |          0 |           59 |         3540 |
| Fri, 01 Jan 2016 01:00:59 | Fri, 01 Jan 2016 02:00:00 |          1 |           60 |         3541 |
+---------------------------+---------------------------+------------+--------------+--------------+
Revenir au début