Formats d’entrée et de sortie de la date et de l’heure¶
Dans ce chapitre :
Comment Snowflake détermine les formats d’entrée et de sortie à utiliser ?¶
Pour déterminer les formats d’entrée et de sortie à utiliser pour les dates, les heures et les horodatages, Snowflake utilise :
Paramètres de session pour les dates, heures et horodatages¶
Un ensemble de paramètres de session détermine comment les données de date, d’heure et d’horodatage sont transmises vers et depuis Snowflake, ainsi que le fuseau horaire utilisé dans les formats d’heure et d’horodatage qui prennent en charge les fuseaux horaires.
Les paramètres peuvent être définis aux niveaux du compte, de l’utilisateur et de la session. Exécutez la commande SHOW PARAMETERS pour afficher les paramètres actuels qui s’appliquent à toutes les opérations de la session en cours.
Formats d’entrée¶
Les paramètres suivants définissent les formats de date, d’heure et d’horodatage reconnus pour DML, y compris les opérations COPY, INSERT et MERGE :
La valeur par défaut des trois paramètres est AUTO. Lorsque la valeur du paramètre est définie sur AUTO, Snowflake tente de faire correspondre les chaînes de date, d’heure et d’horodatage dans toute expression d’entrée avec l’un des formats figurant dans la liste des formats énumérés dans Formats pris en charge pour la détection AUTO.
Si un format correspondant est trouvé, Snowflake accepte la chaîne.
Si aucun format correspondant n’est trouvé, Snowflake renvoie une erreur.
Formats de sortie¶
Les paramètres suivants définissent les formats de sortie de date et d’heure de Snowflake :
De plus, le paramètre suivant mappe l’alias de type de donnée TIMESTAMP à l’une des trois variations TIMESTAMP_* :
Fuseau horaire¶
Le paramètre suivant détermine le fuseau horaire :
Options de format de fichier pour le chargement/déchargement de dates, d’heures et d’horodatages¶
Outre les paramètres de format d’entrée et de sortie, Snowflake offre trois options de format de fichier à utiliser lors du chargement ou du déchargement des données de tables Snowflake :
DATE_FORMAT
TIME_FORMAT
TIMESTAMP_FORMAT
Les options peuvent être spécifiées directement dans la commande COPY ou dans une zone de préparation nommée ou un objet de format de fichier référencé dans la commande COPY. Lorsqu’elles sont spécifiées, ces options remplacent les formats d’entrée correspondants (lors du chargement des données) ou les formats de sortie (lors du déchargement de données).
Chargement des données¶
Lorsqu’elles sont utilisées dans le chargement de données, les options spécifient le format des chaînes de date, d’heure et d’horodatage dans vos fichiers de données préparés. Les options remplacent les paramètres DATE_INPUT_FORMAT, TIME_INPUT_FORMAT ou TIMESTAMP_INPUT_FORMAT.
La valeur par défaut pour toutes ces options est AUTO, ce qui signifie que la commande COPY INTO <table> tente de faire correspondre toutes les chaînes de date et d’horodatage dans les fichiers de données préparés avec l’un des formats énumérés dans Formats pris en charge pour la détection AUTO.
Si un format correspondant est trouvé, Snowflake accepte la chaîne.
Si aucun format correspondant n’est trouvé, Snowflake renvoie une erreur et effectue ensuite l’action spécifiée pour l’option de copie ON_ERROR.
Avertissement
Snowflake prend en charge la détection automatique des formats de date, d’heure et d’horodatage les plus courants (voir les tables ci-dessous). Cependant, certains formats peuvent produire des résultats ambigus, ce qui peut amener Snowflake à appliquer un format incorrect en utilisant AUTO pour le chargement des données.
Pour garantir un chargement correct des données, Snowflake recommande fortement de définir explicitement les options de format de fichier pour le chargement des données.
Déchargement des données¶
Lorsqu’elles sont utilisées dans le déchargement de données, les options spécifient le format appliqué aux dates, aux heures et aux horodatages déchargés dans les fichiers de la zone de préparation spécifiée.
La valeur par défaut pour toutes ces options est AUTO, ce qui signifie que Snowflake applique le formatage spécifié dans les paramètres suivants :
DATE_OUTPUT_FORMAT
TIME_OUTPUT_FORMAT
TIMESTAMP_*_OUTPUT_FORMAT (en fonction du paramètre TIMESTAMP_TYPE_MAPPING)
À propos des éléments utilisés dans les formats d’entrée et de sortie¶
Dans les formats d’entrée et de sortie que vous spécifiez dans les paramètres, les options de format de fichier et les fonctions de conversion, vous pouvez utiliser les éléments énumérés dans le tableau ci-dessous.
Les sections suivantes utilisent également ces éléments pour décrire les formats reconnus automatiquement par Snowflake.
Élément de format |
Description |
---|---|
|
Année à quatre chiffres. |
|
Année à deux chiffres, contrôlée par le paramètre de session TWO_DIGIT_CENTURY_START , par exemple lorsqu’il est réglé sur |
|
Mois à deux chiffres (01=janvier, etc.). |
|
Nom complet ou abrégé du mois. |
|
Nom complet du mois. |
|
Jour du mois à deux chiffres (01 au 31). |
|
Jour de la semaine abrégé. |
|
Deux chiffres pour l’heure (00 à 23). Vous ne devez pas spécifier |
|
Deux chiffres pour l’heure (01 à 12). Vous pouvez spécifier |
|
Ante meridiem (am) / post meridiem (pm). À utiliser uniquement avec |
|
Deux chiffres pour la minute (00 à 59). |
|
Deux chiffres pour la seconde (00 à 59). |
|
Fractions de seconde avec une précision de 0 (secondes) à 9 (nanosecondes), par ex. |
|
Heure et minute du fuseau horaire, décalage par rapport à UTC. Peut être préfixé par un signe |
|
Année à quatre chiffres au format ISO, qui sont négatifs pour les années BCE. |
Note
Lorsqu’un format de date comprenant uniquement une date est utilisé, l’heure associée est supposée être minuit ce jour-là.
Tout ce qui se trouve dans le format entre guillemets doubles ou autre que les éléments ci-dessus est analysé/formaté sans être interprété.
Pour plus de détails sur les plages valides, le nombre de chiffres et les meilleures pratiques, voir Informations supplémentaires sur l’utilisation des formats de date, d’heure et d’horodatage.
Formats pris en charge pour la détection AUTO¶
Sur demande, Snowflake détecte et traite automatiquement les formats spécifiques pour les chaînes d’entrée de date, d’heure et d’horodatage. Les sections suivantes décrivent les formats pris en charge :
Attention
Certaines chaînes peuvent correspondre à plusieurs formats. Par exemple, « 07-04-2016 » est compatible avec les formats MM-DD-YYYY
et DD-MM-YYYY
, mais a des significations différentes dans chaque format (4 juillet et 7 avril). Le fait qu’un format correspondant soit trouvé ne garantit pas que la chaîne est analysée comme le souhaite l’utilisateur.
Bien que la détection automatique du format de date soit pratique, elle augmente le risque d’interprétation erronée des dates. Snowflake recommande vivement de spécifier explicitement le format plutôt que de s’appuyer sur la détection automatique de la date.
Formats de date¶
Pour la description des éléments utilisés dans les formats ci-dessous, voir À propos des éléments utilisés dans les formats d’entrée et de sortie.
Format |
Exemple |
Remarques |
---|---|---|
Formats de date ISO |
||
YYYY-MM-DD |
|
|
Autres formats de date |
||
DD-MON-YYYY |
|
|
MM/DD/YYYY |
|
Peut produire des dates incorrectes lors du chargement ou de l’utilisation de dates dans des formats européens classiques (c.-à-d. |
Lorsque vous utilisez le formatage de date AUTO, les tirets et les barres obliques ne sont pas interchangeables. Les barres obliques impliquent le format MM/DD/YYYY
, tandis que les tirets impliquent le format YYYY-MM-DD
. Les chaînes telles que « 2019/01/02 » ou « 01-02-2019 » ne sont pas interprétées comme prévu.
Formats d’heure¶
Pour la description des éléments utilisés dans les formats ci-dessous, voir À propos des éléments utilisés dans les formats d’entrée et de sortie.
Format |
Exemple |
Remarques |
---|---|---|
Formats d’heure ISO |
||
HH24:MI:SS.FFTZH:TZM |
|
|
HH24:MI:SS.FF |
|
|
HH24:MI:SS |
|
|
HH24:MI |
|
|
Formats d’heure Internet (RFC) |
||
HH12:MI:SS.FF AM |
|
|
HH12:MI:SS AM |
|
|
HH12:MI AM |
|
L’élément de format AM
autorise les valeurs avec AM
ou PM
.
Note
L’élément de format AM
ne doit être utilisé qu’avec HH12
(pas avec HH24
).
Lorsqu’un décalage de fuseau horaire (par exemple, « 0800 ») se produit immédiatement après un chiffre dans une chaîne d’heure ou d’horodatage, le décalage du fuseau horaire doit commencer par +
ou -
. Le signe permet d’éviter toute ambiguïté lorsque les secondes fractionnaires ou le décalage de fuseau horaire ne contiennent pas le nombre maximum de chiffres autorisés. Par exemple, sans séparateur entre le dernier chiffre des secondes fractionnaires et le premier chiffre du fuseau horaire, le « 1 » dans l’heure « 04:04:04.321200 » pourrait être soit le dernier chiffre des secondes fractionnaires (par exemple, 321 millisecondes), soit le premier chiffre du décalage de fuseau horaire (par exemple 12 heures avant UTC).
Formats d’horodatage¶
Pour la description des éléments utilisés dans les formats ci-dessous, voir À propos des éléments utilisés dans les formats d’entrée et de sortie.
Format |
Exemple |
Remarques |
---|---|---|
Formats d’horodatage ISO |
||
YYYY-MM-DD"T"HH24:MI:SS.FFTZH:TZM |
|
Les guillemets doubles autour de |
YYYY-MM-DD HH24:MI:SS.FFTZH:TZM |
|
|
YYYY-MM-DD HH24:MI:SS.FFTZH |
|
|
YYYY-MM-DD HH24:MI:SS.FF TZH:TZM |
|
|
YYYY-MM-DD HH24:MI:SS.FF TZHTZM |
|
|
YYYY-MM-DD HH24:MI:SS TZH:TZM |
|
|
YYYY-MM-DD HH24:MI:SS TZHTZM |
|
|
YYYY-MM-DD"T"HH24:MI:SS.FF |
|
Les guillemets doubles autour de |
YYYY-MM-DD HH24:MI:SS.FF |
|
|
YYYY-MM-DD"T"HH24:MI:SS |
|
Les guillemets doubles autour de |
YYYY-MM-DD HH24:MI:SS |
|
|
YYYY-MM-DD"T"HH24:MI |
|
Les guillemets doubles autour de |
YYYY-MM-DD HH24:MI |
|
|
YYYY-MM-DD"T"HH24 |
|
Les guillemets doubles autour de |
YYYY-MM-DD HH24 |
|
|
YYYY-MM-DD"T"HH24:MI:SSTZH:TZM |
|
Les guillemets doubles autour de |
YYYY-MM-DD HH24:MI:SSTZH:TZM |
|
|
YYYY-MM-DD HH24:MI:SSTZH |
|
|
YYYY-MM-DD"T"HH24:MITZH:TZM |
|
Les guillemets doubles autour de |
YYYY-MM-DD HH24:MITZH:TZM |
|
|
Formats d’horodatage Internet (RFC) |
||
DY, DD MON YYYY HH24:MI:SS TZHTZM |
|
|
DY, DD MON YYYY HH24:MI:SS.FF TZHTZM |
|
|
DY, DD MON YYYY HH12:MI:SS AM TZHTZM |
|
|
DY, DD MON YYYY HH12:MI:SS.FF AM TZHTZM |
|
|
DY, DD MON YYYY HH24:MI:SS |
|
|
DY, DD MON YYYY HH24:MI:SS.FF |
|
|
DY, DD MON YYYY HH12:MI:SS AM |
|
|
DY, DD MON YYYY HH12:MI:SS.FF AM |
|
|
Autres formats d’horodatage |
||
MM/DD/YYYY HH24:MI:SS |
|
Peut produire des dates incorrectes lors du chargement ou de l’utilisation de dates dans des formats européens classiques (c.-à-d. |
DY MON DD HH24:MI:SS TZHTZM YYYY |
|
Lorsqu’un décalage de fuseau horaire (par exemple, « 0800 ») se produit immédiatement après un chiffre dans une chaîne d’heure ou d’horodatage, le décalage du fuseau horaire doit commencer par +
ou -
. Le signe permet d’éviter toute ambiguïté lorsque les secondes fractionnaires ou le décalage de fuseau horaire ne contiennent pas le nombre maximum de chiffres autorisés. Par exemple, sans séparateur entre le dernier chiffre des secondes fractionnaires et le premier chiffre du fuseau horaire, le « 1 » dans l’heure « 04:04:04.321200 » pourrait être soit le dernier chiffre des secondes fractionnaires (par exemple, 321 millisecondes), soit le premier chiffre du décalage de fuseau horaire (par exemple 12 heures avant UTC).
Astuce
Dans certains formats d’horodatage, la lettre T
est utilisée comme séparateur entre la date et l’heure (par exemple 'YYYY-MM-DD"T"HH24:MI:SS'
).
Les guillemets autour du T
sont facultatifs. Cependant, Snowflake recommande d’utiliser des guillemets doubles autour du T
(et d’autres littéraux) pour éviter toute ambiguïté.
Les guillemets doubles ne doivent figurer que dans le spécificateur de format, pas dans les valeurs réelles. Par exemple :
SELECT TO_TIMESTAMP('2019-02-28T23:59:59', 'YYYY-MM-DD"T"HH24:MI:SS');
De plus, les guillemets autour de T
doivent être des guillemets doubles.
Informations supplémentaires sur l’utilisation des formats de date, d’heure et d’horodatage¶
Les sections suivantes décrivent les exigences et les meilleures pratiques pour chaque champ relatifs à la date, l’heure et l’horodatage.
Plages de valeurs valides pour les champs¶
Les plages de valeurs recommandées pour chaque champ sont indiquées ci-dessous :
Champ |
Valeurs |
Remarques |
---|---|---|
Années |
|
Certaines valeurs hors de cette plage peuvent être acceptées dans certains contextes, mais Snowflake recommande d’utiliser uniquement les valeurs de cette plage. Par exemple, l’année 0000 est acceptée, mais elle est incorrecte, car dans le calendrier grégorien, l’année 1 apr. J.-C. vient immédiatement après l’année 1 av. J.-C. ; il n’y a pas d’année 0. |
Mois |
|
|
Jours |
|
Au cours des mois comptant moins de 31 jours, le maximum réel correspond au nombre de jours dans le mois. |
Heures |
De |
Ou |
Minutes |
|
|
Secondes |
|
Snowflake ne prend pas en charge les secondes intercalaires ou les secondes intercalaires additionnelles ; les valeurs |
Fraction |
|
Le nombre de chiffres après le point décimal dépend en partie du spécificateur de format exact (par exemple, |
Utilisation du nombre correct de chiffres avec des éléments de format¶
Pour la plupart des champs (année, mois, jour, heure, minute et seconde), les éléments (YYYY
, MM
, DD
, etc.) du spécificateur de format sont composés de deux ou quatre caractères.
Les règles suivantes indiquent le nombre de chiffres à spécifier dans les valeurs littérales :
YYYY
: vous pouvez spécifier un, deux, trois ou quatre chiffres de l’année. Cependant, Snowflake recommande de spécifier quatre chiffres. Si nécessaire, ajoutez des zéros non significatifs. Par exemple, l’année 536 après J.C. serait « 0536 ».YY
: spécifiez un ou deux chiffres de l’année. Cependant, Snowflake recommande de spécifier deux chiffres. Si nécessaire, ajoutez un zéro non significatif.MM
: spécifiez un ou deux chiffres. Par exemple, janvier peut être représenté par « 01 » ou « 1 ». Snowflake recommande d’utiliser deux chiffres.DD
: spécifiez un ou deux chiffres. Snowflake recommande d’utiliser deux chiffres.HH12
etHH24
: spécifiez un ou deux chiffres. Snowflake recommande d’utiliser deux chiffres.MI
: spécifiez un ou deux chiffres. Snowflake recommande d’utiliser deux chiffres.SS
: spécifiez un ou deux chiffres. Snowflake recommande d’utiliser deux chiffres.FF9
: spécifiez entre un et neuf chiffres (inclus). Snowflake recommande de spécifier le nombre de chiffres significatifs réels. Les zéros de fin ne sont pas requis.TZH
: spécifiez un ou deux chiffres. Snowflake recommande d’utiliser deux chiffres.TZM
: spécifiez un ou deux chiffres. Snowflake recommande d’utiliser deux chiffres.
Snowflake recommande de spécifier le nombre maximal de chiffres pour tous les champs (sauf les fractions de seconde). Utilisez des zéros de début si nécessaire. « 0001-02-03 04:05:06 -07:00 » respecte le format recommandé, par exemple.
Pour les fractions de seconde, les zéros de fin sont facultatifs. En règle générale, il est considéré comme une bonne pratique de ne spécifier que le nombre de chiffres fiables et significatifs. Par exemple, si une mesure de temps est exacte à 3 décimales (millisecondes), le spécifier sous une forme à neuf chiffres (par exemple, « .123000000 ») peut induire en erreur.
Espaces dans les spécificateurs de valeurs et de format¶
Snowflake applique des espaces correspondants dans certaines situations, mais pas toutes. Par exemple, l’instruction suivante génère une erreur, car il n’y a pas d’espace entre les jours et les heures dans la valeur spécifiée, mais entre DD
et HH
dans le spécificateur de format :
SELECT TO_TIMESTAMP('2019-02-2823:59:59 -07:00', 'YYYY-MM-DD HH24:MI:SS TZH:TZM');
Cependant, l’instruction suivante ne génère pas d’erreur, même si la valeur contient un espace là où le spécificateur n’en a pas :
SELECT TO_TIMESTAMP('2019-02-28 23:59:59.000000000 -07:00', 'YYYY-MM-DDHH24:MI:SS.FF TZH:TZM');
La raison de la différence est que dans le premier cas, les valeurs seraient ambiguës si les champs ne sont pas tous à leur largeur maximale. Par exemple, « 213 » peut être interprété comme 2 jours et 13 heures ou bien comme 21 jours et 3 heures. Cependant, DDHH
est sans équivoque identique à DD HH
(à l’exception des espaces).
Astuce
Bien que certaines différences d’espace soient autorisées afin de traiter des données à format variable, Snowflake recommande que les valeurs et les spécificateurs correspondent exactement, y compris les espaces.
Dépendance de contexte¶
Toutes les restrictions ne sont pas appliquées de manière égale dans tous les contextes. Par exemple, certaines expressions appliquent un report pour le 31 février, d’autres non.
Résumé des meilleures pratiques pour spécifier le format¶
Ces meilleures pratiques minimisent les ambiguïtés et autres problèmes potentiels dans les versions antérieures, actuelles et futures de Snowflake :
Soyez conscient des dangers du mélange de données provenant de sources utilisant différents formats (par exemple, du mélange de données qui suivent le format américain courant
MM-DD-YYYY
et le format européen courantDD-MM-YYYY
).Spécifiez le nombre maximal de chiffres pour chaque champ (sauf les fractions de secondes). Par exemple, utilisez des années sur quatre chiffres, en spécifiant des zéros de début, si nécessaire.
Spécifiez un espace ou la lettre
T
entre la date et l’heure dans un horodatage.Les espaces (et le séparateur
T
facultatif entre la date et l’heure) doivent être identiques dans les valeurs et le spécificateur de format.Utilisez l’arithmétique des intervalles si vous avez besoin de l’équivalent d’un report.
Soyez prudent lorsque vous utilisez le formatage AUTO. Si possible, spécifiez le format et assurez-vous que les valeurs correspondent toujours au format spécifié.
Il est plus sûr de spécifier le format dans la commande plutôt que de spécifier le format en dehors de la commande, par exemple dans un paramètre tel que DATE_INPUT_FORMAT. (Voir les exemples ci-dessous.)
Lorsque vous déplacez des scripts d’un environnement à un autre, assurez-vous que les paramètres liés à la date, tels que DATE_INPUT_FORMAT, sont les mêmes dans le nouvel environnement et dans l’ancien (en supposant que les valeurs ont également le même format).
Fonctions de date et d’heure¶
Snowflake fournit un ensemble de fonctions pour construire, convertir, extraire ou modifier des données DATE/TIME/TIMESTAMP. Pour plus d’informations, voir Fonctions Date & Heure.
Détection AUTO de valeurs de date, d’heure et d’horodatage stockées en entier¶
Pour les nombres entiers de secondes ou de millisecondes stockés dans une chaîne, Snowflake tente de déterminer l’unité correcte de l’heure en fonction de la longueur de la valeur.
Note
L’utilisation d’entiers entre guillemets comme entrées est obsolète.
Par exemple, pour calculer l’horodatage équivalent à 1487654321 secondes depuis le début de l’epoch Unix :
select to_timestamp('1487654321');
-------------------------------+
TO_TIMESTAMP('1487654321') |
-------------------------------+
2017-02-20 21:18:41.000000000 |
-------------------------------+
Voici un calcul similaire en millisecondes depuis le début de l’epoch :
select to_timestamp('1487654321321');
-------------------------------+
TO_TIMESTAMP('1487654321321') |
-------------------------------+
2017-02-20 21:18:41.321000000 |
-------------------------------+
En fonction de l’ampleur de la valeur, Snowflake utilise une unité de mesure différente :
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.
Note
Avertissement de dépréciation : les futures versions de Snowflake pourraient interpréter automatiquement les valeurs entières converties en chaînes comme des secondes plutôt que comme des millisecondes, microsecondes ou nanosecondes. Snowflake vous recommande d’appeler TO_DATE, TO_TIME ou TO_TIMESTAMP avec des chaînes qui contiennent des entiers uniquement lorsque ces entiers sont destinés à être interprétés comme des secondes.
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.
Dans les cas où des chaînes formatées et des entiers dans des chaînes sont transmis à la fonction, chaque valeur est convertie en fonction du contenu de la chaîne. Par exemple, si vous passez une chaîne formatée en date et une chaîne contenant un entier à TO_TIMESTAMP, la fonction interprète correctement chaque valeur en fonction de ce que contient chaque chaîne :
select to_timestamp(column1) from values ('2013-04-05'), ('1487654321');
+-------------------------+
| TO_TIMESTAMP(COLUMN1) |
|-------------------------|
| 2013-04-05 00:00:00.000 |
| 2017-02-21 05:18:41.000 |
+-------------------------+
Date et heure : bonnes pratiques relatives au format¶
La détection AUTO détermine habituellement le bon format d’entrée ; cependant, il peut arriver que la détermination soit erronée.
Pour éviter ce cas de figure, Snowflake recommande fortement les bonnes pratiques suivantes (remplacer TO_DATE , DATE ou TO_TIME , TIME par TO_TIMESTAMP, le cas échéant) :
Évitez d’utiliser le format AUTO s’il y a des risques de résultats ambigus. Spécifiez une chaîne de format explicite par :
Définition de TIMESTAMP_INPUT_FORMAT et d’autres paramètres de session pour les dates, horodatages et heures. Voir Paramètres de session pour les dates, heures et horodatages (dans ce chapitre).
Spécification du format en utilisant la syntaxe suivante :
TO_TIMESTAMP(<value>, '<format>')
Pour les chaînes contenant des valeurs d’entier, spécifiez l’échelle, à l’aide de la syntaxe suivante :
TO_TIMESTAMP(TO_NUMBER(<string_column>), <scale>)