Catégories :

Fonctions de conversion , Fonctions de date et d’heure

TO_DATE , DATE

Convertit une expression d’entrée en date :

  • Pour une expression VARCHAR, résultat de la conversion de la chaîne en date.

  • Pour une expression TIMESTAMP, date de l’horodatage.

  • Pour une expression VARIANT :

    • Si la VARIANT contient une chaîne, une conversion de chaîne est effectuée.

    • Si la VARIANT contient une date, la valeur de date est conservée telle quelle.

    • Si la VARIANT contient une valeur nulle JSON, la sortie est NULL.

  • Pour une entrée NULL, la sortie est NULL.

Pour toutes les autres valeurs, une erreur de conversion est générée.

Voir aussi :

TRY_TO_DATE

Syntaxe

TO_DATE( <string_expr> [, <format> ] )
TO_DATE( <timestamp_expr> )
TO_DATE( '<integer>' )
TO_DATE( <variant_expr> )

DATE( <string_expr> [, <format> ] )
DATE( <timestamp_expr> )
DATE( '<integer>' )
DATE( <variant_expr> )
Copy

Arguments

Obligatoire :

Une des options :

string_expr

Chaîne à partir de laquelle extraire une date. Par exemple : '2024-01-31'.

timestamp_expr

Expression TIMESTAMP. La portion DATE de la valeur TIMESTAMP est extraite.

'integer'

Expression qui est évaluée sur (correspond à) une chaîne contenant un entier. Par exemple : '15000000'. Selon l’ampleur de la chaîne, elle peut être interprétée comme des secondes, des millisecondes, des microsecondes ou des nanosecondes. Pour plus de détails, voir les Notes sur l’utilisation de cette fonction.

variant_expr

Expression de type VARIANT.

VARIANT doit contenir l’un des éléments suivants :

  • Une chaîne à partir de laquelle extraire une date.

  • Une date.

  • Chaîne contenant un entier qui représente le nombre de secondes ou de millisecondes.

Bien que TO_DATE accepte une valeur TIMESTAMP, il n’accepte pas de valeur TIMESTAMP dans une VARIANT.

Facultatif :

format

Spécificateur de format de date pour string_expr ou AUTO, qui précise que Snowflake détecte automatiquement le format à utiliser. Pour plus d’informations, voir Formats de date et d’heure dans les fonctions de conversion.

La valeur par défaut est la valeur actuelle du paramètre de session DATE_INPUT_FORMAT (AUTO par défaut).

Renvoie

Le type de données de la valeur renvoyée est DATE. Si l’entrée est NULL, renvoie NULL.

Notes sur l’utilisation

  • Le format d’affichage des dates dans la sortie est déterminé par le paramètre de session DATE_OUTPUT_FORMAT (par défaut, YYYY-MM-DD).

  • Si le format du paramètre d’entrée est une chaîne contenant un entier :

    • Une fois la chaîne convertie en entier, l’entier est traité comme un nombre de secondes, millisecondes, microsecondes ou nanosecondes après le début de l’epoch Unix (1970-01-01 00:00:00.000000000 UTC).

      • Si l’entier est inférieur à 31536000000 (le nombre de millisecondes dans une année), alors la valeur est traitée comme un nombre de secondes.

      • Si la valeur est supérieure ou égale à 31536000000 et inférieure à 31536000000000, la valeur est alors traitée en millisecondes.

      • Si la valeur est supérieure ou égale à 31536000000000 et inférieure à 31536000000000000, la valeur est alors traitée en microsecondes.

      • Si la valeur est supérieure ou égale à 31536000000000000, alors la valeur est traitée comme des nanosecondes.

    • Si plusieurs lignes sont évaluées (par exemple, si l’entrée est le nom de colonne d’une table qui contient plus d’une ligne), chaque valeur est examinée indépendamment pour déterminer si elle représente des secondes, des millisecondes, des microsecondes ou des nanosecondes.

Exemples

Les exemples suivants utilisent les fonctions TO_DATE et DATE.

Exemple de base

SELECT TO_DATE('2024-05-10'), DATE('2024-05-10');
Copy
+-----------------------+--------------------+
| TO_DATE('2024-05-10') | DATE('2024-05-10') |
|-----------------------+--------------------|
| 2024-05-10            | 2024-05-10         |
+-----------------------+--------------------+

Exemple qui extrait la date d’un horodatage

La fonction TO_DATE accepte les valeurs TIMESTAMP et les chaînes au format TIMESTAMP, mais ignore les informations de temps (heures, minutes, etc.).

Créer et charger la table :

CREATE OR REPLACE TABLE date_from_timestamp(ts TIMESTAMP);

INSERT INTO date_from_timestamp(ts)
  VALUES (TO_TIMESTAMP('2024.10.02 04:00:00', 'YYYY.MM.DD HH:MI:SS'));
Copy

Interroger la valeur TIMESTAMP dans la table :

SELECT ts FROM date_from_timestamp;
Copy
+-------------------------+
| TS                      |
|-------------------------|
| 2024-10-02 04:00:00.000 |
+-------------------------+

Interroger la valeur TIMESTAMP dans la table en utilisant la fonction TO_DATE :

SELECT TO_DATE(ts) FROM date_from_timestamp;
Copy
+-------------+
| TO_DATE(TS) |
|-------------|
| 2024-10-02  |
+-------------+

Exemples utilisant différents formats d’entrée

Les exemples suivants utilisent les fonctions TO_DATE et DATE avec différentes spécifications de format d’entrée. Le format de date dans la sortie renvoyée est déterminé par la définition du paramètre de session DATE_OUTPUT_FORMAT.

SELECT TO_DATE('2024.05.10', 'YYYY.MM.DD'), DATE('2024.05.10', 'YYYY.MM.DD');
Copy
+-------------------------------------+----------------------------------+
| TO_DATE('2024.05.10', 'YYYY.MM.DD') | DATE('2024.05.10', 'YYYY.MM.DD') |
|-------------------------------------+----------------------------------|
| 2024-05-10                          | 2024-05-10                       |
+-------------------------------------+----------------------------------+
SELECT TO_DATE('2024-05-10', 'AUTO'), DATE('2024-05-10', 'AUTO');
Copy
+-------------------------------+----------------------------+
| TO_DATE('2024-05-10', 'AUTO') | DATE('2024-05-10', 'AUTO') |
|-------------------------------+----------------------------|
| 2024-05-10                    | 2024-05-10                 |
+-------------------------------+----------------------------+
SELECT TO_DATE('05/10/2024', 'MM/DD/YYYY'), DATE('05/10/2024', 'MM/DD/YYYY');
Copy
+-------------------------------------+----------------------------------+
| TO_DATE('05/10/2024', 'MM/DD/YYYY') | DATE('05/20/2024', 'MM/DD/YYYY') |
|-------------------------------------+----------------------------------|
| 2024-05-10                          | 2024-05-20                       |
+-------------------------------------+----------------------------------+

Exemples utilisant différents formats de sortie

Les exemples suivants montrent les résultats des requêtes lorsque le paramètre de session DATE_OUTPUT_FORMAT est défini sur DD-MON-YYYY :

ALTER SESSION SET DATE_OUTPUT_FORMAT = 'DD-MON-YYYY';
Copy
SELECT TO_DATE('2024-05-10', 'YYYY-MM-DD'), DATE('2024-05-10', 'YYYY-MM-DD');
Copy
+-------------------------------------+----------------------------------+
| TO_DATE('2024-05-10', 'YYYY-MM-DD') | DATE('2024-05-10', 'YYYY-MM-DD') |
|-------------------------------------+----------------------------------|
| 10-May-2024                         | 10-May-2024                      |
+-------------------------------------+----------------------------------+
SELECT TO_DATE('05/10/2024', 'MM/DD/YYYY'), DATE('05/10/2024', 'MM/DD/YYYY');
Copy
+-------------------------------------+----------------------------------+
| TO_DATE('05/10/2024', 'MM/DD/YYYY') | DATE('05/10/2024', 'MM/DD/YYYY') |
|-------------------------------------+----------------------------------|
| 10-May-2024                         | 10-May-2024                      |
+-------------------------------------+----------------------------------+

Exemples utilisant une chaîne contenant un entier

Lorsque l’entrée est une chaîne qui contient un nombre entier, la magnitude de ce nombre entier détermine si elle est interprétée comme des secondes, des millisecondes, etc. L’exemple suivant montre comment la fonction sélectionne les unités à utiliser (secondes, millisecondes, microsecondes ou nanosecondes) en fonction de l’ampleur de la valeur.

Créer et charger la table :

CREATE OR REPLACE TABLE demo1 (
  description VARCHAR,
  value VARCHAR -- string rather than bigint
);

INSERT INTO demo1 (description, value) VALUES
  ('Seconds',      '31536000'),
  ('Milliseconds', '31536000000'),
  ('Microseconds', '31536000000000'),
  ('Nanoseconds',  '31536000000000000');
Copy

Passez les chaînes à la fonction :

SELECT description,
       value,
       TO_TIMESTAMP(value),
       TO_DATE(value)
  FROM demo1
  ORDER BY value;
Copy
+--------------+-------------------+-------------------------+----------------+
| DESCRIPTION  | VALUE             | TO_TIMESTAMP(VALUE)     | TO_DATE(VALUE) |
|--------------+-------------------+-------------------------+----------------|
| Seconds      | 31536000          | 1971-01-01 00:00:00.000 | 1971-01-01     |
| Milliseconds | 31536000000       | 1971-01-01 00:00:00.000 | 1971-01-01     |
| Microseconds | 31536000000000    | 1971-01-01 00:00:00.000 | 1971-01-01     |
| Nanoseconds  | 31536000000000000 | 1971-01-01 00:00:00.000 | 1971-01-01     |
+--------------+-------------------+-------------------------+----------------+