Types de données de date et heure

Snowflake prend en charge les types de données pour la gestion des dates, des heures et des horodatages (date + heure combinées). Snowflake prend également en charge les formats pour les constantes de chaîne utilisées lors de la manipulation des dates, des heures et des horodatages.

Types de données

Snowflake prend en charge les types de données de date et d’heure suivants :

Note

Pour les données DATE et TIMESTAMP, Snowflake recommande d’utiliser des années comprises entre 1582 et 9999. Snowflake accepte certaines années en dehors de cette plage, mais les années antérieures à 1582 doivent être évitées en raison des limitations du calendrier grégorien.

DATE

Snowflake prend en charge un seul type de données DATE pour stocker les dates (sans éléments horaires).

DATE accepte les dates sous les formes les plus courantes (YYYY-MM-DD, DD-MON-YYYY, etc.).

De plus, toutes les valeurs TIMESTAMP acceptées sont des entrées valides pour les dates ; cependant, les informations TIME sont tronquées.

DATETIME

DATETIME est synonyme de TIMESTAMP_NTZ.

Type de données d’intervalle

Les types de données d’intervalle stockent des valeurs qui représentent une durée de temps. Vous pouvez calculer un intervalle comme la différence entre deux dates ou heures. Un intervalle définit uniquement une durée ; il n’a donc pas de début ou de point de fin dans le temps. Par exemple, vous pouvez définir un intervalle comme trois ans et sept mois.

Snowflake prend en charge les variantes année-mois suivantes des types de données d’intervalle :

Type de données

Description

INTERVAL YEAR

Représente une durée en années.

INTERVAL YEAR TO MONTH

Représente une durée en années et en mois.

INTERVAL MONTH

Représente une durée en mois.

Snowflake prend en charge les variantes jour-heure suivantes des types de données d’intervalle :

Type de données

Description

INTERVAL DAY

Représente une durée en jours.

INTERVAL DAY TO HOUR

Représente une durée en jours et en heures.

INTERVAL DAY TO MINUTE

Représente une durée en jours, en heures et en minutes.

INTERVAL DAY TO SECOND

Représente une durée en jours, en heures, en minutes, en secondes et en fractions de secondes.

INTERVAL HOUR

Représente une durée en heures.

INTERVAL HOUR TO MINUTE

Représente une durée en heures et en minutes.

INTERVAL HOUR TO SECOND

Représente une durée en heures, en minutes, en secondes et en fractions de secondes.

INTERVAL MINUTE

Représente une durée en minutes.

INTERVAL MINUTE TO SECOND

Représente une durée en minutes, en secondes et en fractions de secondes.

INTERVAL SECOND

Représente une durée en secondes et en fractions de secondes.

Les sections suivantes décrivent plus en détail les types de données d’intervalle :

Note

Vous pouvez également utiliser des constantes d’intervalle pour le calcul de la date et de l’heure. Cependant, les constantes d’intervalle ne prennent pas en charge le stockage d’intervalle comme type de colonne.

Avantages des types de données d’intervalle

Les types de données d’intervalle offrent les avantages suivants :

  • Assurez un calcul de date précis et sans ambiguïté.

  • Éliminez la nécessité d’effectuer manuellement des opérations de conversion et de transformation à partir de durées basées sur des nombres entiers.

  • Optimisez le stockage des données qui représentent des intervalles de temps.

  • Optimisez l’exécution des requêtes pour les données de durée.

  • Simplifiez la migration des données des bases de données tierces, telles que Databricks, Oracle et Teradata.

  • Conformez-vous entièrement aux normes ANSI.

Syntaxe des types de données d’intervalle

Pour spécifier un type de données d’intervalle, utilisez la syntaxe suivante :

INTERVAL { yearMonthQualifier | dayTimeQualifier }

Où :

yearMonthQualifier ::=
  {
    YEAR [ (<precision>) ] [ TO MONTH ]
    | MONTH [ (<precision>) ]
  }
dayTimeQualifier ::=
  {
    DAY [ (<precision>) ] [ TO { HOUR | MINUTE | SECOND [ (<fractional_seconds_precision>) ] } ]
    | HOUR [ (<precision>) ] [ TO { MINUTE | SECOND [ (<fractional_seconds_precision>) ] } ]
    | MINUTE [ (<precision>) ] [ TO SECOND [ (<fractional_seconds_precision>) ] ]
    | SECOND [ (<precision>) [ , (<fractional_seconds_precision>) ] ]
  }

Propriétés :

  • precision correspond au nombre total de chiffres autorisés. La précision peut varier de 1 à 9.

    Par défaut : 9

  • fractional_seconds_precision correspond au nombre de chiffres de la partie fractionnaire d’une seconde. La précision temporelle peut varier de 0 (secondes) à 9 (nanosecondes).

    Par défaut : 9

Utilisez cette syntaxe lorsque vous spécifiez un type de données d’intervalle. Par exemple, la table suivante contient une colonne duration de type INTERVAL YEAR TO MONTH :

CREATE OR REPLACE TEMPORARY TABLE sample_table_with_interval (
  id VARCHAR,
  duration INTERVAL YEAR(2) TO MONTH);

Représentation des valeurs d’intervalle

Vous pouvez représenter une valeur d’intervalle en utilisant un littéral d’intervalle ou un format d’intervalle :

Littéraux d’intervalle

Un littéral d’intervalle est une expression qui spécifie une durée dans un littéral de chaîne. Utilisez la syntaxe suivante pour spécifier un littéral d’intervalle :

INTERVAL '[ <sign> ] <string>' { <yearMonthQualifier> | <dayTimeQualifier> }

Où :

Formats d’intervalle

Les littéraux de chaîne dans des formats spécifiques peuvent représenter des valeurs d’intervalle.

Pour spécifier des valeurs pour les années et les mois, utilisez le format suivant :

'<sign><Y>-<MM>'

Où :

  • sign est un symbole obligatoire qui spécifie une durée positive (+) ou négative (-).

    Par défaut : +.

  • Y correspond au nombre d’années. Le nombre de chiffres autorisés (précision) dépend du type de données de la valeur.

  • MM correspond à deux chiffres pour le nombre de mois, de 00 à 11.

Pour spécifier des valeurs de jours, d’heures, de secondes et de fractions de seconde, utilisez le format suivant :

'<sign>[<D>] [<HH24>]:[<MI>]:[<SS>].[<F>]'

Où :

  • sign est un symbole obligatoire qui spécifie une durée positive (+) ou négative (-).

    Par défaut : +.

  • D correspond au nombre de jours. Le nombre de chiffres autorisés (précision) dépend du type de données de la valeur.

    Omettez D pour les valeurs des types suivants :

    • INTERVAL HOUR

    • INTERVAL HOUR TO MINUTE

    • INTERVAL HOUR TO SECOND

    • INTERVAL MINUTE

    • INTERVAL MINUTE TO SECOND

    • INTERVAL SECOND

  • HH24 correspond à deux chiffres pour le nombre d’heures, de 00 à 23.

    Omettez HH24 pour les valeurs des types suivants :

    • INTERVAL DAY

    • INTERVAL MINUTE

    • INTERVAL MINUTE TO SECOND

    • INTERVAL SECOND

  • MI correspond à deux chiffres pour le nombre de minutes, de 00 à 59.

    Omettez MI pour les valeurs des types suivants :

    • INTERVAL DAY TO HOUR

    • INTERVAL DAY

    • INTERVAL HOUR

    • INTERVAL SECOND

  • SS correspond à deux chiffres pour le nombre de secondes, de 00 à 59.

    Omettez SS pour les valeurs des types suivants :

    • INTERVAL DAY

    • INTERVAL DAY TO HOUR

    • INTERVAL DAY TO MINUTE

    • INTERVAL HOUR

    • INTERVAL HOUR TO MINUTE

    • INTERVAL MINUTE

  • F correspond au nombre de fractions de secondes pour les types de données qui incluent des secondes. Le nombre de chiffres autorisés (précision) dépend du type de données de la valeur.

Les notes sur l’utilisation suivantes s’appliquent aux littéraux de chaîne au format d’intervalle :

  • La représentation littérale de chaîne s’applique lorsque vous utilisez la fonction CAST ou TO_CHAR pour convertir explicitement des intervalles en chaînes de texte.

  • Les zéros de début dans un champ spécifient la précision.

Exemples de valeurs d’intervalle

Le tableau suivant montre comment représenter différentes valeurs d’intervalle. Les valeurs indiquées dans le tableau sont conformes aux règles suivantes pour les valeurs d’intervalle :

  • Pour les valeurs positives, le signe plus + est facultatif pour les valeurs littérales d’intervalle, mais obligatoire pour les valeurs de format d’intervalle.

  • Dans les valeurs littérales d’intervalle, la valeur entre parenthèses spécifie la précision, qui correspond au nombre de chiffres autorisés. Par exemple, YEAR(3) précise que trois chiffres sont autorisés pour l’année.

  • Dans les valeurs de format d’intervalle, le champ principal (le champ de début) ne comprend pas de zéros de début. Les champs subordonnés utilisent un nombre fixe de chiffres. Par exemple, dans une valeur YEAR TO MONTH comme +1-08, le champ année n’a pas de zéros de début et le champ mois utilise deux chiffres.

Durée

Type

Valeur littérale d’intervalle

Valeur de format d’intervalle

Positif 5 ans

INTERVAL YEAR

INTERVAL '5' YEAR(2)

'+5'

Positif 1 an et 8 mois

INTERVAL YEAR TO MONTH

INTERVAL '1-08' YEAR(3) TO MONTH

'+001-08'

Négatif 5 mois

INTERVAL MONTH

INTERVAL '-5' MONTH(2)

'-5'

Positif 14 mois

INTERVAL MONTH

INTERVAL '14' MONTH(2)

'+14'

Négatif 44 ans et 11 mois

INTERVAL YEAR TO MONTH

INTERVAL '-44-11' YEAR(2) TO MONTH

'-44-11'

Positif 11 jours, 10 heures et 9 minutes

INTERVAL DAY TO MINUTE

INTERVAL '11 10:09' DAY(2) TO MINUTE

'+11 10:09'

Positif 2 jours, 23 heures, 8 minutes, 23 secondes et 275 millisecondes

INTERVAL DAY TO SECOND

INTERVAL '02 23:08:23.275' DAY(2) TO SECOND(3)

'+2 23:08:23.275'

Positif 4 secondes et 300 millisecondes

INTERVAL SECOND

INTERVAL '4.3' SECOND(5, 6)

'+4.300000'

Opérations qui impliquent des valeurs de date et d’heure

Le tableau suivant montre le type de données du résultat pour les opérations de calcul valides qui impliquent des valeurs d’intervalle :

Premier opérande

Opérateur

Deuxième opérande

Type de résultat

Horodatage

-

Horodatage

Un type de données d’intervalle

Date ou horodatage

+

Intervalle

DATE, DATETIME, TIMESTAMP_LTZ, TIMESTAMP_NTZ, ou TIMESTAMP_TZ

Date ou horodatage

-

Intervalle

DATE, DATETIME, TIMESTAMP_LTZ, TIMESTAMP_NTZ, ou TIMESTAMP_TZ

Intervalle

+

Date ou horodatage

DATE, DATETIME, TIMESTAMP_LTZ, TIMESTAMP_NTZ, ou TIMESTAMP_TZ

Numérique

*

Intervalle

Un type de données d’intervalle

Intervalle

*

Numérique

Un type de données d’intervalle

Intervalle

/

Numérique

Un type de données d’intervalle

Intervalle

+

Intervalle

Un type de données d’intervalle

Intervalle

-

Intervalle

Un type de données d’intervalle

Pour les opérations qui impliquent deux valeurs d’intervalle, les valeurs doivent toutes deux être des valeurs d’intervalle année-mois, ou elles doivent toutes deux être des valeurs d’intervalle jour-heure. Les opérations qui combinent des valeurs d’intervalle année-mois et des valeurs d’intervalle jour-heure ne sont pas prises en charge. Lorsque l’opération implique deux valeurs d’intervalle année-mois, le type de résultat est un type d’intervalle année-mois. Lorsque l’opération implique deux valeurs d’intervalle jour-heure, le type de résultat est un type d’intervalle jour-heure.

Fonctions acceptant des valeurs d’intervalle comme arguments

Les fonctions suivantes acceptent des valeurs d’intervalle comme arguments :

Exemples de types de données d’intervalle

Les exemples suivants montrent comment utiliser des types de données d’intervalle :

Effectuer des calculs en utilisant des données d’intervalle

Les exemples suivants effectuent des calculs en utilisant des données d’intervalle.

Ajoutez une année et un mois à une date :

SELECT TO_DATE('2024-01-01') + INTERVAL '1-1' YEAR TO MONTH
  AS date_plus_one_year_one_month;
+------------------------------+
| DATE_PLUS_ONE_YEAR_ONE_MONTH |
|------------------------------|
| 2025-02-01                   |
+------------------------------+

Soustrayez une année et un mois à une date :

SELECT TO_DATE('2024-01-01') + INTERVAL '-1-1' YEAR TO MONTH
  AS date_plus_one_year_one_month;
+------------------------------+
| DATE_PLUS_ONE_YEAR_ONE_MONTH |
|------------------------------|
| 2022-12-01                   |
+------------------------------+

Ajoutez une période de temps à un horodatage :

SELECT TO_TIMESTAMP('2024-01-01 08:08:08.99') + INTERVAL '1 01:01:01.7878' DAY TO SECOND
  AS date_plus_period_of_time;
+--------------------------+
| DATE_PLUS_PERIOD_OF_TIME |
|--------------------------|
| 2024-01-02 09:09:10.777  |
+--------------------------+

L’exemple suivant utilise la fonction SYSTEM$TYPEOF pour montrer qu’une valeur INTERVAL DAY TO SECOND est renvoyée lorsqu’une requête soustrait deux valeurs d’horodatage :

SELECT SYSTEM$TYPEOF(TO_TIMESTAMP('2025-10-05 01:02:03') - TO_TIMESTAMP('2025-09-15 11:36:22'))
  AS type;
+------------------------------------+
| TYPE                               |
|------------------------------------|
| INTERVAL DAY(9) TO SECOND(9)[SB16] |
+------------------------------------+

Pour afficher les résultats de la requête au format d’intervalle, vous pouvez convertir l’expression en type de données INTERVAL DAY(2) TO SECOND(2) pour spécifier la précision, puis convertir ce type de données en valeur VARCHAR :

SELECT (TO_TIMESTAMP('2025-10-05 01:02:03') - TO_TIMESTAMP('2025-09-15 11:36:22'))::INTERVAL DAY(2) TO SECOND(2)::VARCHAR
  AS interval_format_result;
+------------------------+
| INTERVAL_FORMAT_RESULT |
|------------------------|
| +19 13:25:41.00        |
+------------------------+
Insertion et interrogation de données d’intervalle année-mois

Créez une table permettant de suivre les candidatures aux postes vacants au moyen d’une colonne INTERVAL YEAR TO MONTH, puis insérez-y les données :

CREATE OR REPLACE TABLE candidates (
  name_first VARCHAR,
  name_last VARCHAR,
  duration_of_experience INTERVAL YEAR(2) TO MONTH);

INSERT INTO candidates VALUES ('Jane', 'Smith', '14-4');
INSERT INTO candidates VALUES ('Robert', 'Adams', '0-3');
INSERT INTO candidates VALUES ('Mary', 'Jones', '5-11');

Lorsque vous interrogez la table sans convertir la colonne ` duration_of_experience`` en un type de données, la sortie affiche les valeurs de la colonne sous forme de nombre total de mois dans chaque ligne :

SELECT name_first,
       name_last,
       duration_of_experience AS months_of_experience
  FROM candidates;
+------------+-----------+----------------------+
| NAME_FIRST | NAME_LAST | MONTHS_OF_EXPERIENCE |
|------------+-----------+----------------------|
| Jane       | Smith     |                  172 |
| Robert     | Adams     |                    3 |
| Mary       | Jones     |                   71 |
+------------+-----------+----------------------+

Lorsque vous interrogez la table et que vous convertissez la colonne duration_of_experience en type de données VARCHAR, la sortie affiche les valeurs de la colonne au format d’intervalle :

SELECT name_first,
       name_last,
       duration_of_experience::VARCHAR AS duration_of_experience
  FROM candidates;
+------------+-----------+------------------------+
| NAME_FIRST | NAME_LAST | DURATION_OF_EXPERIENCE |
|------------+-----------+------------------------|
| Jane       | Smith     | +14-04                 |
| Robert     | Adams     | +0-03                  |
| Mary       | Jones     | +5-11                  |
+------------+-----------+------------------------+
Insertion et interrogation de données d’intervalle jour-heure

Créez une table qui spécifie la durée d’expiration pour différentes fonctionnalités logicielles au moyen d’une colonne INTERVAL HOUR TO SECOND, puis insérez-y les données :

CREATE OR REPLACE TABLE feature_timeouts (
  feature VARCHAR,
  timeout_duration INTERVAL HOUR(2) TO SECOND(0));

INSERT INTO feature_timeouts VALUES ('Feature1', '00:00:30');
INSERT INTO feature_timeouts VALUES ('Feature2', '00:10:00');
INSERT INTO feature_timeouts VALUES ('Feature3', '01:00:00');

Interrogez la table et convertissez la colonne timeout_duration en type de données VARCHAR :

SELECT feature,
       timeout_duration::VARCHAR AS timeout_duration
  FROM feature_timeouts;
+----------+------------------+
| FEATURE  | TIMEOUT_DURATION |
|----------+------------------|
| Feature1 | +0:00:30         |
| Feature2 | +0:10:00         |
| Feature3 | +1:00:00         |
+----------+------------------+
Copie de données d’intervalle dans une table et interrogation de la table

Procédez comme suit pour mettre en zone de préparation un fichier avec des données d’intervalle, puis copiez le fichier dans une table :

  1. Dans un fichier de votre système de fichiers, copiez le contenu suivant :

    1,1-2,28 16:15:14.0
    2,-3-2,-54 16:15:14.123
    

    Cet exemple suppose que le fichier est nommé interval_values.csv dans le répertoire /examples/intervals/.

  2. Créez une zone de préparation :

    CREATE STAGE interval_stage;
    
  3. Dans l’emplacement de mise en zone de préparation interne, mettez le fichier en zone de préparation :

    PUT file:///examples/intervals/interval_values.csv @~/interval_stage
      AUTO_COMPRESS=false;
    
  4. Créez une table pour les données :

    CREATE OR REPLACE TABLE sample_interval_values(
      c1 STRING,
      c2 INTERVAL YEAR(1) TO MONTH,
      c3 INTERVAL DAY(2) TO SECOND(3));
    
  5. Pour charger le fichier en zone de préparation dans la table que vous avez créée, utilisez la commande COPY INTO <table> :

    COPY INTO sample_interval_values FROM @~/interval_stage;
    
  6. Pour afficher les données chargées, interrogez la table, puis convertissez les données en type VARCHAR pour afficher les données chargées :

    SELECT c1,
           c2::VARCHAR AS YEAR_TO_MONTH,
           c3::VARCHAR AS DAY_TO_SECOND,
      FROM sample_interval_values;
    
    +----+---------------+------------------+
    | C1 | YEAR_TO_MONTH | DAY_TO_SECOND    |
    |----+---------------+------------------|
    | 1  | +1-02         | +28 16:15:14.000 |
    | 2  | -3-02         | -54 16:15:14.123 |
    +----+---------------+------------------+
    

Limitations relatives aux types de données d’intervalle

Les limitations suivantes s’appliquent aux types de données d’intervalle :

  • Les valeurs d’intervalle année-mois ne peuvent pas être combinées ou comparées avec des valeurs d’intervalle jour-heure.

  • Les constantes d’intervalle et les valeurs des types de données d’intervalle ne peuvent pas être combinées ou comparées.

  • Les constantes d’intervalle ne peuvent pas être insérées dans une colonne qui dispose d’un type de données d’intervalle.

  • Les valeurs VARIANT ne peuvent pas contenir de valeurs d’intervalle.

  • Les valeurs de types de données structurées ne peuvent pas contenir de valeurs d’intervalle.

  • Les expressions d’intervalle ne peuvent pas être utilisées dans des fonctions définies par l’utilisateur (UDFs) ou dans l’:doc:` Exécution de scripts Snowflake </developer-guide/snowflake-scripting/index>`.

  • Les types de tables suivants ne peuvent pas avoir de colonnes d’intervalle :

  • Les requêtes sur les colonnes d’intervalle ne peuvent pas bénéficier du Service d’optimisation de la recherche.

TIME

Snowflake prend en charge un seul type de données TIME pour stocker les heures sous la forme de HH:MI:SS.

TIME prend en charge un paramètre de précision optionnel pour les fractions de seconde (par exemple TIME(3)). La précision temporelle peut varier de 0 (secondes) à 9 (nanosecondes). La précision par défaut est 9.

Toutes les valeurs de TIME doivent être comprises entre 00:00:00 et 23:59:59.999999999. TIME stocke en interne l’heure « wallclock », et toutes les opérations sur les valeurs TIME sont effectuées sans tenir compte d’aucun fuseau horaire.

TIMESTAMP_LTZ , TIMESTAMP_NTZ , TIMESTAMP_TZ

Snowflake prend en charge trois variantes d’horodatage :

TIMESTAMP_LTZ:

TIMESTAMP_LTZ stocke en interne les valeurs UTC avec une précision spécifiée. Cependant, toutes les opérations sont effectuées dans le fuseau horaire de la session en cours, contrôlé par le paramètre de session TIMEZONE.

Synonyme de TIMESTAMP_LTZ :

  • TIMESTAMPLTZ

  • TIMESTAMP WITH LOCAL TIME ZONE

TIMESTAMP_NTZ:

TIMESTAMP_NTZ stocke en interne le temps « wallclock » avec une précision spécifiée. Toutes les opérations sont effectuées sans tenir compte d’aucun fuseau horaire.

Si le format de sortie contient un fuseau horaire, l’indicateur UTC (Z) est affiché.

TIMESTAMP_NTZ est la valeur par défaut pour TIMESTAMP.

Synonyme de TIMESTAMP_NTZ :

  • TIMESTAMPNTZ

  • TIMESTAMP WITHOUT TIME ZONE

  • DATETIME

TIMESTAMP_TZ:

TIMESTAMP_TZ stocke en interne les valeurs UTC ainsi qu’un décalage de fuseau horaire associé. Lorsqu’un fuseau horaire n’est pas fourni, le décalage de fuseau horaire de session est utilisé. Toutes les opérations sont effectuées avec le décalage de fuseau horaire spécifique à chaque enregistrement.

Synonyme de TIMESTAMP_TZ :

  • TIMESTAMPTZ

  • TIMESTAMP WITH TIME ZONE

Les valeurs TIMESTAMP_TZ sont comparées en fonction de leur heure en UTC. Par exemple, la comparaison suivante entre différentes heures dans des fuseaux horaires différents renvoie TRUE, car les deux valeurs ont des heures équivalentes en UTC.

SELECT '2024-01-01 00:00:00 +0000'::TIMESTAMP_TZ = '2024-01-01 01:00:00 +0100'::TIMESTAMP_TZ;

Attention

TIMESTAMP_TZ ne stocke actuellement que le décalage d’un fuseau horaire donné au moment de la création d’une valeur donnée, et non le fuseau horaire réel. Cela est particulièrement important lorsqu’il s’agit de la période de l’heure d’été, qui n’est pas utilisée par UTC.

Par exemple, avec le paramètre TIMEZONE réglé sur "America/Los_Angeles", la conversion d’une valeur en TIMESTAMP_TZ en janvier d’une année donnée stocke un décalage horaire de -0800. Si plus tard, six mois sont ajoutés à la valeur, le décalage -0800 est conservé, même si en juillet le décalage pour Los Angeles est de -0700. En effet, une fois la valeur créée, l’information de fuseau horaire actuel ("America/Los_Angeles") n’est plus disponible. L’exemple de code suivant illustre ce comportement :

SELECT '2024-01-01 12:00:00'::TIMESTAMP_TZ;
+-------------------------------------+
| '2024-01-01 12:00:00'::TIMESTAMP_TZ |
|-------------------------------------|
| 2024-01-01 12:00:00.000 -0800       |
+-------------------------------------+
SELECT DATEADD(MONTH, 6, '2024-01-01 12:00:00'::TIMESTAMP_TZ);
+--------------------------------------------------------+
| DATEADD(MONTH, 6, '2024-01-01 12:00:00'::TIMESTAMP_TZ) |
|--------------------------------------------------------|
| 2024-07-01 12:00:00.000 -0800                          |
+--------------------------------------------------------+

TIMESTAMP

TIMESTAMP dans Snowflake est un alias spécifié par l’utilisateur associé à l’une des variations TIMESTAMP_*. Dans toutes les opérations où TIMESTAMP est utilisé, la variation TIMESTAMP_* spécifiée est automatiquement utilisée. Le type de données TIMESTAMP n’est jamais stocké dans les tables.

La variation TIMESTAMP_* associée à TIMESTAMP est spécifiée par le paramètre de session TIMESTAMP_TYPE_MAPPING. La valeur par défaut est TIMESTAMP_NTZ.

Toutes les variations d’horodatage, y compris l’alias TIMESTAMP, prennent en charge un paramètre de précision optionnel pour les secondes fractionnaires (par exemple TIMESTAMP(3)). La précision de l’horodatage peut varier de 0 (secondes) à 9 (nanosecondes). La précision par défaut est 9.

Exemples d’horodatage

Ces exemples créent une table en utilisant différents horodatages.

Tout d’abord, créez une table avec une colonne TIMESTAMP (mappée sur TIMESTAMP_NTZ) :

ALTER SESSION SET TIMESTAMP_TYPE_MAPPING = TIMESTAMP_NTZ;

CREATE OR REPLACE TABLE ts_test(ts TIMESTAMP);

DESC TABLE ts_test;
+------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| name | type             | kind   | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
| TS   | TIMESTAMP_NTZ(9) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
+------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+

Ensuite, utilisez explicitement l’une des variations TIMESTAMP (TIMESTAMP_LTZ) :

CREATE OR REPLACE TABLE ts_test(ts TIMESTAMP_LTZ);

DESC TABLE ts_test;
+------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| name | type             | kind   | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
| TS   | TIMESTAMP_LTZ(9) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
+------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+

Utiliser TIMESTAMP_LTZ avec des fuseaux horaires différents :

CREATE OR REPLACE TABLE ts_test(ts TIMESTAMP_LTZ);

ALTER SESSION SET TIMEZONE = 'America/Los_Angeles';

INSERT INTO ts_test VALUES('2024-01-01 16:00:00');
INSERT INTO ts_test VALUES('2024-01-02 16:00:00 +00:00');

Cette requête montre que l’heure du 2 janvier est 08h00 à Los Angeles (qui est 16h00 à UTC) :

SELECT ts, HOUR(ts) FROM ts_test;
+-------------------------------+----------+
| TS                            | HOUR(TS) |
|-------------------------------+----------|
| 2024-01-01 16:00:00.000 -0800 |       16 |
| 2024-01-02 08:00:00.000 -0800 |        8 |
+-------------------------------+----------+

Ensuite, notez que les horaires changent avec un fuseau horaire différent :

ALTER SESSION SET TIMEZONE = 'America/New_York';

SELECT ts, HOUR(ts) FROM ts_test;
+-------------------------------+----------+
| TS                            | HOUR(TS) |
|-------------------------------+----------|
| 2024-01-01 19:00:00.000 -0500 |       19 |
| 2024-01-02 11:00:00.000 -0500 |       11 |
+-------------------------------+----------+

Créez une table et utilisez TIMESTAMP_NTZ :

CREATE OR REPLACE TABLE ts_test(ts TIMESTAMP_NTZ);

ALTER SESSION SET TIMEZONE = 'America/Los_Angeles';

INSERT INTO ts_test VALUES('2024-01-01 16:00:00');
INSERT INTO ts_test VALUES('2024-01-02 16:00:00 +00:00');

Notez que les deux heures de fuseaux horaires différents sont converties à la même heure « d’horloge murale » :

SELECT ts, HOUR(ts) FROM ts_test;
+-------------------------+----------+
| TS                      | HOUR(TS) |
|-------------------------+----------|
| 2024-01-01 16:00:00.000 |       16 |
| 2024-01-02 16:00:00.000 |       16 |
+-------------------------+----------+

Ensuite, notez que la modification du fuseau horaire de la session n’affecte pas les résultats :

ALTER SESSION SET TIMEZONE = 'America/New_York';

SELECT ts, HOUR(ts) FROM ts_test;
+-------------------------+----------+
| TS                      | HOUR(TS) |
|-------------------------+----------|
| 2024-01-01 16:00:00.000 |       16 |
| 2024-01-02 16:00:00.000 |       16 |
+-------------------------+----------+

Créez une table et utilisez TIMESTAMP_TZ :

CREATE OR REPLACE TABLE ts_test(ts TIMESTAMP_TZ);

ALTER SESSION SET TIMEZONE = 'America/Los_Angeles';

INSERT INTO ts_test VALUES('2024-01-01 16:00:00');
INSERT INTO ts_test VALUES('2024-01-02 16:00:00 +00:00');

Notez que l’enregistrement du 1er janvier a hérité du fuseau horaire de la session et que America/Los_Angeles a été converti en décalage de fuseau horaire numérique :

SELECT ts, HOUR(ts) FROM ts_test;
+-------------------------------+----------+
| TS                            | HOUR(TS) |
|-------------------------------+----------|
| 2024-01-01 16:00:00.000 -0800 |       16 |
| 2024-01-02 16:00:00.000 +0000 |       16 |
+-------------------------------+----------+

Ensuite, notez que la modification du fuseau horaire de la session n’affecte pas les résultats :

ALTER SESSION SET TIMEZONE = 'America/New_York';

SELECT ts, HOUR(ts) FROM ts_test;
+-------------------------------+----------+
| TS                            | HOUR(TS) |
|-------------------------------+----------|
| 2024-01-01 16:00:00.000 -0800 |       16 |
| 2024-01-02 16:00:00.000 +0000 |       16 |
+-------------------------------+----------+

Calendrier pris en charge

Snowflake utilise le calendrier grégorien pour toutes les dates et tous les horodatages. Le calendrier grégorien commence à l’année 1582, mais reconnaît les années précédentes. Il est important de noter que Snowflake n’ajuste pas les dates antérieures à 1582 (ou les calculs impliquant des dates antérieures à 1582) pour correspondre au calendrier julien. L’élément de format UUUU prend en charge les années négatives.

Formats de date et d’heure

Tous ces types de données acceptent la plupart des formats de date, d’heure ou de date + heure non ambigus. Voir Formats pris en charge pour la détection AUTO pour les formats que Snowflake reconnaît lorsque est configuré pour détecter le format automatiquement.

Vous pouvez également spécifier le format de la date et de l’heure manuellement. Lorsque vous spécifiez le format, vous pouvez utiliser les éléments non sensibles à la casse énumérés dans le tableau suivant :

Élément de format

Description

YYYY

Année à quatre chiffres :sup :[1].

YY

Année à deux chiffres [1], contrôlée par le paramètre de session TWO_DIGIT_CENTURY_START. Par exemple, lorsqu’il est défini sur 1980, les valeurs de 79 et 80 sont analysées respectivement comme 2079 et 1980.

Y

Année à un chiffre ou à deux chiffres [2] sans zéros de début, contrôlée par le paramètre de session TWO_DIGIT_CENTURY_START. Par exemple, lorsque le paramètre est défini sur 1990, les valeurs de 2005 et 1991 sont sérialisées en tant que 5 et 91, respectivement.

MM

Mois à deux chiffres [1] (01 = janvier, et ainsi de suite).

MO

Mois à un chiffre ou à deux chiffres [2] sans zéros de début (1 = janvier, et ainsi de suite).

MON

Nom abrégé du mois [3].

MMMM

Nom complet du mois [3].

DD

Jour du mois à deux chiffres [1] (01 à 31).

D

Jour du mois à un chiffre ou à deux chiffres [2] sans zéros de début (de 1 à 31).

DY

Jour de la semaine abrégé.

HH24

Deux chiffres [1] pour l’heure (00 à 23). Vous ne devez pas spécifier AM/PM ou A/P.

HH12

Deux chiffres [1] pour l’heure (01 à 12). Vous pouvez spécifier AM/PM ou A/P.

H24

Un ou deux chiffres :sup :[2] pour l’heure sans zéros de début (de 0 à 23). Vous ne devez pas spécifier AM/PM ou A/P.

H12

Un ou deux chiffres :sup :[2] pour l’heure sans zéros de début (de 1 à 12). Vous pouvez spécifier AM/PM ou A/P.

AM , PM

Ante meridiem (matin) (AM) / post meridiem (après-midi) (PM). Utilisez ceci uniquement avec HH12 et code:H12 (pas avec HH24 ou H24).

P

Ante meridiem (matin) (A) / post meridiem (après-midi) (P). Utilisez ceci uniquement avec HH12 et code:H12 (pas avec HH24 ou H24).

HH

Synonyme de HH24.

H

Synonyme de H24.

MI

Deux chiffres [1] pour la minute (00 à 59).

ME

Un ou deux chiffres :sup :[2] pour la minute sans zéros de début (de 0 à 59).

SS

Deux chiffres [1] pour la seconde (00 à 59).

S

Un ou deux chiffres :sup :[2] pour la seconde sans zéros de début (de 0 à 59).

FF[0-9]

Fractions de secondes d’une précision de 0 (secondes) à 9 (nanosecondes), par exemple FF, FF0, FF3, FF9. Spécifier FF équivaut à FF9 (nanosecondes).

TZH:TZM , TZHTZM , TZH

Heure et minute de fuseau horaire à deux chiffres [1], décalage par rapport à UTC. Peut être préfixé par un signe +/-.

UUUU

Année à quatre chiffres au format ISO, qui sont négatifs pour les années BCE.

[1] Le nombre de chiffres décrit la sortie produite lors de la sérialisation des valeurs en texte. Lors de l’analyse du texte, Snowflake accepte jusqu’au nombre de chiffres spécifié. Par exemple, le numéro d’un jour peut être composé de un ou deux chiffres.

[2] Le nombre de chiffres décrit la sortie produite lors de la sérialisation des valeurs en texte. L’analyse n’est pas prise en charge. Si une analyse est nécessaire, utilisez un format équivalent incluant des zéros de début. Ces éléments de format seront activés dans le bundle BCR 2026_03.

[3] Pour l’élément de format MON, la sortie produite lors de la sérialisation des valeurs en texte est le nom abrégé du mois. Pour l’élément de format MMMM, la sortie produite lors de la sérialisation des valeurs en texte est le nom complet du mois. Lors de l’analyse de texte, Snowflake accepte l’abréviation à trois chiffres ou le nom de mois complet pour MON et MMMM. Par exemple, « January » ou « Jan », « February » ou « Feb », etc. sont acceptés lors de l’analyse de texte.

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é. Snowflake recommande de toujours entourer les caractères littéraux entre guillemets doubles (par exemple, "T", "EST", "Z") pour s’assurer qu’ils sont traités comme des littéraux.

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

Exemples d’utilisation des formats de date et d’heure

L’exemple suivant utilise FF pour indiquer que la sortie a 9 chiffres dans le champ des secondes fractionnaires :

CREATE OR REPLACE TABLE timestamp_demo_table(
  tstmp TIMESTAMP,
  tstmp_tz TIMESTAMP_TZ,
  tstmp_ntz TIMESTAMP_NTZ,
  tstmp_ltz TIMESTAMP_LTZ);
INSERT INTO timestamp_demo_table (tstmp, tstmp_tz, tstmp_ntz, tstmp_ltz) VALUES (
  '2024-03-12 01:02:03.123456789',
  '2024-03-12 01:02:03.123456789',
  '2024-03-12 01:02:03.123456789',
  '2024-03-12 01:02:03.123456789');
ALTER SESSION SET TIMESTAMP_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
ALTER SESSION SET TIMESTAMP_TZ_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
ALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
ALTER SESSION SET TIMESTAMP_LTZ_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
SELECT tstmp, tstmp_tz, tstmp_ntz, tstmp_ltz
  FROM timestamp_demo_table;
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
| TSTMP                         | TSTMP_TZ                      | TSTMP_NTZ                     | TSTMP_LTZ                     |
|-------------------------------+-------------------------------+-------------------------------+-------------------------------|
| 2024-03-12 01:02:03.123456789 | 2024-03-12 01:02:03.123456789 | 2024-03-12 01:02:03.123456789 | 2024-03-12 01:02:03.123456789 |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+

Constantes de date et d’heure

Les constantes (aussi connues sous le nom de littéraux) sont des valeurs de données fixes. Snowflake prend en charge la spécification de valeurs fixes de date, d’heure ou d’horodatage à l’aide de valeurs d’horodatage. Les constantes de chaînes doivent toujours être délimitées par des caractères de délimitation. Snowflake accepte l’utilisation de guillemets simples pour délimiter les constantes de chaîne de caractères.

Par exemple :

DATE '2024-08-14'
TIME '10:03:56'
TIMESTAMP '2024-08-15 10:59:43'

La chaîne est analysée en tant que valeur DATE, TIME ou TIMESTAMP en fonction du format d’entrée du type de données, défini via les paramètres suivants :

DATE:

DATE_INPUT_FORMAT

TIME:

TIME_INPUT_FORMAT

TIMESTAMP:

TIMESTAMP_INPUT_FORMAT

Par exemple, insérez une date spécifique dans une colonne à l’intérieur d’une table :

CREATE TABLE t1 (d1 DATE);

INSERT INTO t1 (d1) VALUES (DATE '2024-08-15');

Constantes d’intervalle

Vous pouvez utiliser des constantes d’intervalle pour ajouter ou soustraire la période d’une date, d’une heure ou d’un horodatage. Les constantes d’intervalle sont implémentées en utilisant le mot-clé INTERVAL, qui a la syntaxe suivante :

{ + | - } INTERVAL '<integer> [ <date_time_part> ] [ , <integer> [ <date_time_part> ] ... ]'

Comme pour toutes les constantes de chaîne, Snowflake requiert des guillemets simples pour délimiter les constantes d’intervalle.

Note

Les constantes d’intervalle prennent en charge le calcul de la date et de l’heure, mais elles ne prennent pas en charge le stockage d’intervalle en tant que type de colonne. Pour stocker les valeurs d’intervalle dans une colonne, vous pouvez utiliser les types de données d’intervalle.

Le mot-clé INTERVAL prend en charge un ou plusieurs nombres entiers et, éventuellement, une ou plusieurs parties de la date ou de l’heure. Par exemple :

  • INTERVAL '1 year' représente une année.

  • INTERVAL '4 years, 5 months, 3 hours' représente quatre ans, cinq mois et trois heures.

Si aucune partie de date ou d’heure n’est spécifiée, l’intervalle représente les secondes (par exemple INTERVAL '2' équivaut à INTERVAL '2 seconds'). Notez que cela diffère de l’unité de temps par défaut pour l’exécution de l’arithmétique des dates. Pour plus de détails, voir Arithmétique simple pour les dates.

Pour consulter la liste des parties de date et d’heure prises en charge, voir Date et heure prises en charge pour les intervalles.

Note

  • L’ordre des incréments d’intervalle est important. Les incréments sont ajoutés ou soustraits dans l’ordre indiqué. Par exemple :

    • INTERVAL '1 year, 1 day' ajoute ou soustrait d’abord une année, puis un jour.

    • INTERVAL '1 day, 1 year' ajoute ou soustrait d’abord un jour, puis une année.

    Les différentes de tri peuvent affecter les calculs influencés par des événements du calendrier tels que les années bissextiles :

    SELECT TO_DATE ('2019-02-28') + INTERVAL '1 day, 1 year';
    
    +---------------------------------------------------+
    | TO_DATE ('2019-02-28') + INTERVAL '1 DAY, 1 YEAR' |
    |---------------------------------------------------|
    | 2020-03-01                                        |
    +---------------------------------------------------+
    
    SELECT TO_DATE ('2019-02-28') + INTERVAL '1 year, 1 day';
    
    +---------------------------------------------------+
    | TO_DATE ('2019-02-28') + INTERVAL '1 YEAR, 1 DAY' |
    |---------------------------------------------------|
    | 2020-02-29                                        |
    +---------------------------------------------------+
    
  • INTERVAL n’est pas un type de données (à savoir que vous ne pouvez pas définir une colonne de table comme étant du type de données INTERVAL). Les intervalles ne peuvent être utilisés que dans l’arithmétique de la date, de l’heure et de l’horodatage.

  • Vous ne pouvez pas utiliser un intervalle avec une variable SQL. Par exemple, la requête suivante renvoie une erreur :

    SET v1 = '1 year';
    
    SELECT TO_DATE('2023-04-15') + INTERVAL $v1;
    

Parties de date et d’heure prises en charge pour les intervalles

Le mot clé INTERVAL prend en charge les parties de date et heure suivantes comme arguments (non sensibles à la casse) :

Partie de date ou d’heure

Abréviations/variations

year

y , yy , yyy , yyyy , yr , years , yrs

quarter

q , qtr , qtrs , quarters

month

mm, mon, mons, months

week

w, wk, weekofyear, woy, wy, weeks

day

d , dd , days, dayofmonth

hour

h , hh , hr , hours , hrs

minute

m , mi , min , minutes , mins

second

s , sec , seconds , secs

millisecond

ms , msec , milliseconds

microsecond

us , usec , microseconds

nanosecond

ns, nsec, nanosec, nsecond, nanoseconds, nanosecs, nseconds

Exemples d’intervalle

Ajouter un intervalle d’une année à une date précise :

SELECT TO_DATE('2023-04-15') + INTERVAL '1 year';
+-------------------------------------------+
| TO_DATE('2023-04-15') + INTERVAL '1 YEAR' |
|-------------------------------------------|
| 2024-04-15                                |
+-------------------------------------------+

Ajouter un intervalle de 3 heures et 18 minutes à une heure spécifique :

SELECT TO_TIME('04:15:29') + INTERVAL '3 hours, 18 minutes';
+------------------------------------------------------+
| TO_TIME('04:15:29') + INTERVAL '3 HOURS, 18 MINUTES' |
|------------------------------------------------------|
| 07:33:29                                             |
+------------------------------------------------------+

Ajouter un intervalle complexe à la sortie de la fonction CURRENT_TIMESTAMP :

SELECT CURRENT_TIMESTAMP + INTERVAL
    '1 year, 3 quarters, 4 months, 5 weeks, 6 days, 7 minutes, 8 seconds,
    1000 milliseconds, 4000000 microseconds, 5000000001 nanoseconds'
  AS complex_interval1;

Voici un exemple de sortie. La sortie est différente lorsque l’horodatage actuel est différent.

+-------------------------------+
| COMPLEX_INTERVAL1             |
|-------------------------------|
| 2026-11-07 18:07:19.875000001 |
+-------------------------------+

Ajouter un intervalle complexe avec notation abrégée de la date et de l’heure à une date spécifique :

SELECT TO_DATE('2025-01-17') + INTERVAL
    '1 y, 3 q, 4 mm, 5 w, 6 d, 7 h, 9 m, 8 s,
    1000 ms, 445343232 us, 898498273498 ns'
  AS complex_interval2;
+-------------------------------+
| COMPLEX_INTERVAL2             |
|-------------------------------|
| 2027-03-30 07:31:32.841505498 |
+-------------------------------+

Interroger une table d’informations relatives aux employés et renvoyer les noms des employés qui ont été embauchés au cours des deux dernières années et des trois derniers mois :

SELECT name, hire_date
  FROM employees
  WHERE hire_date > CURRENT_DATE - INTERVAL '2 y, 3 month';

Filtrer une colonne TIMESTAMP nommée ts d’une table nommée t1 et ajouter quatre secondes à chaque valeur renvoyée :

SELECT ts + INTERVAL '4 seconds'
  FROM t1
  WHERE ts > TO_TIMESTAMP('2024-04-05 01:02:03');

Arithmétique simple pour les dates

En plus d’utiliser des constantes d’intervalle pour ajouter et soustraire des dates, des heures et des horodatages, vous pouvez également ajouter et soustraire des jours aux valeurs DATE, sous la forme { + | - } integer, où integer spécifie le nombre de jours à ajouter ou soustraire.

Note

Les valeurs TIME et TIMESTAMP ne prennent pas encore en charge l’arithmétique simple.

Exemples arithmétiques de date

Ajouter un jour à une date spécifique :

SELECT TO_DATE('2024-04-15') + 1;
+---------------------------+
| TO_DATE('2024-04-15') + 1 |
|---------------------------|
| 2024-04-16                |
+---------------------------+

Soustraire quatre jours à une date précise :

SELECT TO_DATE('2024-04-15') - 4;
+---------------------------+
| TO_DATE('2024-04-15') - 4 |
|---------------------------|
| 2024-04-11                |
+---------------------------+

Interroger une table nommée employees et renvoyer les noms des personnes qui ont quitté l’entreprise mais qui ont été employées pendant plus de 365 jours :

SELECT name
  FROM employees
  WHERE end_date > start_date + 365;