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

Syntaxe pour DATEDIFF

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

Syntaxe pour le signe moins

<date_or_time_expr2> - <date_or_time_expr1>

Arguments

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

  • 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.

Renvoie

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

Pour la soustraction de date avec le signe moins, les unités sont toujours les jours.

Notes sur l’utilisation

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

Pour DATEDIFF

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

  • partie_date_ou_heure doit être l’une des valeurs listé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.

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

  • Lorsque l’unité utilisée pour calculer la différence est une partie de date (par exemple year, month, day) ou une partie d’heure (par exemple hour, minute, second), seule la ou les partie(e) significative(s) est/sont utilisée(s).

    Par exemple :

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

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

    • day utilise la date entière.

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

    • minute utilise l’heure et les minutes de l’heure / horodatage.

    • second utilise toute l’heure / tout l’horodatage.

    Pour plus de détails, voir ci-dessous.

Pour le signe moins

  • expr_date_ou_heure1 et expr_date_ou_heure2 doivent tous deux être des dates.

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 |
+---------------------------+---------------------------+------------+--------------+--------------+