Fonctions de date et d’heure¶
Cette famille de fonctions peut être utilisée pour construire, convertir, extraire ou modifier ou horodater des données.
Dans ce chapitre :
Liste de fonctions¶
Sous-catégorie |
Fonction |
Remarques |
---|---|---|
Construction |
||
Extraction |
Accepte toutes les parties de date et d’heure (voir Parties de date et d’heure prises en charge). |
|
Alternative pour DATE_PART. |
||
Alternative pour DATE_PART. |
||
Accepte les parties de date pertinentes (voir Parties de date et d’heure prises en charge). |
||
Alternative pour DATE_PART. |
||
Addition/Soustraction |
||
Accepte les parties de date et d’heure pertinentes (voir Parties de date et d’heure prises en charge). |
||
Accepte les parties de date et d’heure pertinentes (voir Parties de date et d’heure prises en charge). |
||
Alias pour DATEADD. |
||
Alias pour DATEDIFF. |
||
Alias pour DATEADD. |
||
Alias pour DATEDIFF. |
||
Troncature |
Accepte les parties de date et d’heure pertinentes (voir Parties de date et d’heure prises en charge). |
|
Permet à une heure d’être « arrondie » au début d’un intervalle régulier. |
||
Alternative pour DATE_TRUNC. |
||
Conversion |
Prend en charge les conversions basées sur des expressions de chaîne, d’horodatage et de VARIANT. Prend en charge les entiers pour les conversions basées sur le début de l’époque Unix. |
|
Prend en charge les conversions basées sur des expressions de chaîne, d’horodatage et de VARIANT. Prend en charge les entiers pour les conversions basées sur le début de l’époque Unix. |
||
Prend en charge les conversions basées sur des expressions de chaîne, de date, d’horodatage et de VARIANT. Prend en charge les expressions numériques et les entiers pour les conversions basées sur le début de l’époque Unix. |
||
Fuseau horaire |
||
Alertes |
||
Formats de sortie¶
Plusieurs fonctions de date et d’heure renvoient des valeurs de date, d’heure et d’horodatage. Les paramètres de session suivants déterminent le format de la sortie renvoyée par ces fonctions :
Le format d’affichage des heures est déterminé par le paramètre de session TIME_OUTPUT_FORMAT (par défaut,
HH24:MI:SS
).Le format d’affichage des dates est déterminé par le paramètre de session DATE_OUTPUT_FORMAT (par défaut,
YYYY-MM-DD
).Le format d’affichage des horodatages est déterminé par le type de données d’horodatage renvoyé par la fonction. Les paramètres de session suivants définissent le format de sortie pour différents types de données d’horodatage :
Pour plus d’informations, voir Formats d’entrée et de sortie de la date et de l’heure.
Parties de date et d’heure prises en charge¶
Certaines fonctions (ainsi que leurs alias et alternatives appropriés) acceptent une partie de date ou d’heure comme argument. Les deux tables suivantes listent les parties (insensibles à la casse) que vous pouvez utiliser avec ces fonctions.
Parties de date |
Abréviations / variations |
DATEADD |
DATEDIFF |
DATE_PART |
DATE_TRUNC |
LAST_DAY |
---|---|---|---|---|---|---|
|
|
✔ |
✔ |
✔ |
✔ |
✔ |
|
|
✔ |
✔ |
✔ |
✔ |
✔ |
|
|
✔ |
✔ |
✔ |
✔ |
|
|
|
✔ |
||||
|
|
✔ |
||||
|
|
✔ |
||||
|
|
✔ |
✔ |
✔ |
✔ |
✔ |
|
|
✔ |
||||
|
|
✔ |
✔ |
✔ |
✔ |
✔ |
|
✔ |
|||||
|
✔ |
[1] Pour plus de détails sur l’utilisation, voir la section suivante, qui décrit comment Snowflake gère les semaines civiles et les jours de semaine.
[2] Non contrôlé par les paramètres de session WEEK_START et WEEK_OF_YEAR_POLICY, comme décrit dans la section suivante.
Parties d’heure |
Abréviations/variations |
DATEADD |
DATEDIFF |
DATE_PART |
DATE_TRUNC |
LAST_DAY |
---|---|---|---|---|---|---|
|
|
✔ |
✔ |
✔ |
✔ |
|
|
|
✔ |
✔ |
✔ |
✔ |
|
|
|
✔ |
✔ |
✔ |
✔ |
|
|
|
✔ |
✔ |
✔ |
||
|
|
✔ |
✔ |
✔ |
||
|
|
✔ |
✔ |
✔ |
✔ |
|
|
|
✔ |
||||
|
|
✔ |
||||
|
|
✔ |
||||
|
|
✔ |
||||
|
|
✔ |
||||
|
|
✔ |
Semaines civiles et jours de semaine¶
Le comportement des fonctions liées aux semaines dans Snowflake est contrôlé par les paramètres de session WEEK_START et WEEK_OF_YEAR_POLICY. Un aspect important pour comprendre comment ces paramètres interagissent est le concept des semaines ISO.
Semaines ISO¶
Comme défini dans la norme de format de date et d’heure ISO 8601, les semaines ISO commencent toujours le lundi et « appartiennent » à l’année qui contient le jeudi de cette semaine. Cela signifie qu’un jour d’une année peut appartenir à une semaine d’une autre année :
Pour les premiers jours de janvier, la valeur WOY (semaine de l’année) peut être 52 ou 53 (c’est-à-dire que le jour appartient à la dernière semaine de l’année précédente).
Pour les derniers jours de décembre, la valeur WOY peut être 1 (c’est-à-dire que le jour appartient à la première semaine de l’année suivante).
Snowflake fournit un ensemble spécial de fonctions de date liées à la semaine (et des parties de données équivalentes) dont le comportement est cohérent avec la sémantique de la semaine ISO : DAYOFWEEKISO, WEEKISO, YEAROFWEEKISO.
Ces fonctions (et parties de date) ne tiennent pas compte des paramètres de session, (c’est-à-dire qu’elles suivent toujours la sémantique ISO).
Pour plus de détails sur le traitement des autres fonctions de date liées à la semaine, reportez-vous aux sections suivantes :
Premier jour de la semaine¶
La plupart des fonctions liées à la semaine sont contrôlées uniquement par le paramètre de session WEEK_START. Les résultats de la fonction diffèrent selon la façon dont le paramètre est défini :
Fonction |
Paramètre réglé sur |
Paramètre réglé sur |
---|---|---|
Retourne |
Retourne |
|
DATE_TRUNC (avec une partie |
Tronque la semaine d’entrée pour commencer le lundi. |
Tronque la semaine d’entrée pour commencer le premier jour défini de la semaine. |
LAST_DAY (avec une partie |
Retourne le dimanche de la semaine d’entrée. |
Retourne le dernier jour de la semaine d’entrée par rapport au premier jour défini de la semaine. |
DATEDIFF (avec une partie |
Calculé sur la base des semaines à partir du lundi. |
Calculé en utilisant les semaines commençant le premier jour défini de la semaine. |
Astuce
La valeur par défaut du paramètre est 0
, qui préserve le comportement hérité de Snowflake (sémantique de type ISO). Cependant, nous recommandons de modifier cette valeur pour contrôler explicitement le comportement résultant des fonctions. Le scénario le plus courant consiste à régler le paramètre sur 1
.
Première et dernière semaines de l’année¶
Le paramètre de session WEEK_OF_YEAR_POLICY contrôle le comportement des fonctions WEEK et YEAROFWEEK. Le paramètre peut avoir deux valeurs :
0
: les fonctions liées à la semaine concernée utilisent une sémantique similaire à celle de la norme ISO. Une semaine appartient à une année donnée si au moins 4 jours de cette semaine sont compris dans cette année. Cela signifie que toutes les semaines ont 7 jours, mais les premiers jours de janvier et les derniers jours de décembre peuvent appartenir à une semaine dans une année différente. Pour cette raison, les deux fonctions YEAROFWEEK et YEAROFWEEKISO peuvent fournir l’année à laquelle la semaine appartient.1
: le 1er janvier commence toujours la première semaine de l’année et le 31 décembre correspond toujours à la dernière semaine de l’année. Cela signifie que la première et la dernière semaine de l’année peuvent avoir moins de 7 jours.
Ce comportement est également influencé par le jour de début de la semaine, contrôlé par la valeur définie pour le paramètre de session WEEK_START :
0
ou1
: le comportement est équivalent à la sémantique ISO d’une semaine, la semaine commençant le lundi.2
à7
: la logique des « 4 jours » est conservée, mais le premier jour de la semaine est différent.
Astuce
La valeur par défaut des deux paramètres est 0
, ce qui préserve le comportement hérité de Snowflake (sémantique de type ISO). Cependant, nous recommandons de modifier ces valeurs pour contrôler explicitement le comportement résultant des fonctions. Le scénario le plus courant consiste à régler les deux paramètres sur 1
.
Exemples¶
Ces exemples interrogent le même ensemble de fonctions de date, mais avec des valeurs différentes pour les paramètres de session WEEK_OF_YEAR_POLICY et WEEK_START pour illustrer comment ils influencent les résultats des fonctions.
Les exemples utilisent les données suivantes :
CREATE OR REPLACE TABLE week_examples (d DATE);
INSERT INTO week_examples VALUES
('2016-12-30'),
('2016-12-31'),
('2017-01-01'),
('2017-01-02'),
('2017-01-03'),
('2017-01-04'),
('2017-01-05'),
('2017-12-30'),
('2017-12-31');
Contrôle du premier jour de la semaine¶
Le réglage de WEEK_START sur 0
(comportement existant) ou 1
(lundi) n’a pas d’effet significatif, comme l’illustrent les deux exemples suivants :
ALTER SESSION SET WEEK_START = 0;
SELECT d "Date",
DAYNAME(d) "Day",
DAYOFWEEK(d) "DOW",
DATE_TRUNC('week', d) "Trunc Date",
DAYNAME("Trunc Date") "Trunc Day",
LAST_DAY(d, 'week') "Last DOW Date",
DAYNAME("Last DOW Date") "Last DOW Day",
DATEDIFF('week', '2017-01-01', d) "Weeks Diff from 2017-01-01 to Date"
FROM week_examples;
+------------+-----+-----+------------+-----------+---------------+--------------+------------------------------------+
| Date | Day | DOW | Trunc Date | Trunc Day | Last DOW Date | Last DOW Day | Weeks Diff from 2017-01-01 to Date |
|------------+-----+-----+------------+-----------+---------------+--------------+------------------------------------|
| 2016-12-30 | Fri | 5 | 2016-12-26 | Mon | 2017-01-01 | Sun | 0 |
| 2016-12-31 | Sat | 6 | 2016-12-26 | Mon | 2017-01-01 | Sun | 0 |
| 2017-01-01 | Sun | 0 | 2016-12-26 | Mon | 2017-01-01 | Sun | 0 |
| 2017-01-02 | Mon | 1 | 2017-01-02 | Mon | 2017-01-08 | Sun | 1 |
| 2017-01-03 | Tue | 2 | 2017-01-02 | Mon | 2017-01-08 | Sun | 1 |
| 2017-01-04 | Wed | 3 | 2017-01-02 | Mon | 2017-01-08 | Sun | 1 |
| 2017-01-05 | Thu | 4 | 2017-01-02 | Mon | 2017-01-08 | Sun | 1 |
| 2017-12-30 | Sat | 6 | 2017-12-25 | Mon | 2017-12-31 | Sun | 52 |
| 2017-12-31 | Sun | 0 | 2017-12-25 | Mon | 2017-12-31 | Sun | 52 |
+------------+-----+-----+------------+-----------+---------------+--------------+------------------------------------+
ALTER SESSION SET WEEK_START = 1;
SELECT d "Date",
DAYNAME(d) "Day",
DAYOFWEEK(d) "DOW",
DATE_TRUNC('week', d) "Trunc Date",
DAYNAME("Trunc Date") "Trunc Day",
LAST_DAY(d, 'week') "Last DOW Date",
DAYNAME("Last DOW Date") "Last DOW Day",
DATEDIFF('week', '2017-01-01', d) "Weeks Diff from 2017-01-01 to Date"
FROM week_examples;
+------------+-----+-----+------------+-----------+---------------+--------------+------------------------------------+
| Date | Day | DOW | Trunc Date | Trunc Day | Last DOW Date | Last DOW Day | Weeks Diff from 2017-01-01 to Date |
|------------+-----+-----+------------+-----------+---------------+--------------+------------------------------------|
| 2016-12-30 | Fri | 5 | 2016-12-26 | Mon | 2017-01-01 | Sun | 0 |
| 2016-12-31 | Sat | 6 | 2016-12-26 | Mon | 2017-01-01 | Sun | 0 |
| 2017-01-01 | Sun | 7 | 2016-12-26 | Mon | 2017-01-01 | Sun | 0 |
| 2017-01-02 | Mon | 1 | 2017-01-02 | Mon | 2017-01-08 | Sun | 1 |
| 2017-01-03 | Tue | 2 | 2017-01-02 | Mon | 2017-01-08 | Sun | 1 |
| 2017-01-04 | Wed | 3 | 2017-01-02 | Mon | 2017-01-08 | Sun | 1 |
| 2017-01-05 | Thu | 4 | 2017-01-02 | Mon | 2017-01-08 | Sun | 1 |
| 2017-12-30 | Sat | 6 | 2017-12-25 | Mon | 2017-12-31 | Sun | 52 |
| 2017-12-31 | Sun | 7 | 2017-12-25 | Mon | 2017-12-31 | Sun | 52 |
+------------+-----+-----+------------+-----------+---------------+--------------+------------------------------------+
Avec WEEK_START défini sur
0
, DOW pour le dimanche est0
.Avec WEEK_START défini sur
1
, DOW pour le dimanche est7
.
Les résultats diffèrent plus significativement si WEEK_START est réglé sur un autre jour que le lundi. Par exemple, le réglage du paramètre sur 3
(mercredi) modifie les résultats de toutes les fonctions liées à la semaine (colonnes 3 à 8) :
ALTER SESSION SET WEEK_START = 3;
SELECT d "Date",
DAYNAME(d) "Day",
DAYOFWEEK(d) "DOW",
DATE_TRUNC('week', d) "Trunc Date",
DAYNAME("Trunc Date") "Trunc Day",
LAST_DAY(d, 'week') "Last DOW Date",
DAYNAME("Last DOW Date") "Last DOW Day",
DATEDIFF('week', '2017-01-01', d) "Weeks Diff from 2017-01-01 to Date"
FROM week_examples;
+------------+-----+-----+------------+-----------+---------------+--------------+------------------------------------+
| Date | Day | DOW | Trunc Date | Trunc Day | Last DOW Date | Last DOW Day | Weeks Diff from 2017-01-01 to Date |
|------------+-----+-----+------------+-----------+---------------+--------------+------------------------------------|
| 2016-12-30 | Fri | 3 | 2016-12-28 | Wed | 2017-01-03 | Tue | 0 |
| 2016-12-31 | Sat | 4 | 2016-12-28 | Wed | 2017-01-03 | Tue | 0 |
| 2017-01-01 | Sun | 5 | 2016-12-28 | Wed | 2017-01-03 | Tue | 0 |
| 2017-01-02 | Mon | 6 | 2016-12-28 | Wed | 2017-01-03 | Tue | 0 |
| 2017-01-03 | Tue | 7 | 2016-12-28 | Wed | 2017-01-03 | Tue | 0 |
| 2017-01-04 | Wed | 1 | 2017-01-04 | Wed | 2017-01-10 | Tue | 1 |
| 2017-01-05 | Thu | 2 | 2017-01-04 | Wed | 2017-01-10 | Tue | 1 |
| 2017-12-30 | Sat | 4 | 2017-12-27 | Wed | 2018-01-02 | Tue | 52 |
| 2017-12-31 | Sun | 5 | 2017-12-27 | Wed | 2018-01-02 | Tue | 52 |
+------------+-----+-----+------------+-----------+---------------+--------------+------------------------------------+
Contrôle de l’année et des jours pour les première et dernière semaines de l’année¶
L’exemple suivant définit les deux paramètres sur 0
afin de suivre une sémantique de type ISO (c’est-à-dire que la semaine commence le lundi et que toutes les semaines ont 7 jours) :
ALTER SESSION SET WEEK_OF_YEAR_POLICY=0, WEEK_START=0;
SELECT d "Date",
DAYNAME(d) "Day",
WEEK(d) "WOY",
WEEKISO(d) "WOY (ISO)",
YEAROFWEEK(d) "YOW",
YEAROFWEEKISO(d) "YOW (ISO)"
FROM week_examples;
+------------+-----+-----+-----------+------+-----------+
| Date | Day | WOY | WOY (ISO) | YOW | YOW (ISO) |
|------------+-----+-----+-----------+------+-----------|
| 2016-12-30 | Fri | 52 | 52 | 2016 | 2016 |
| 2016-12-31 | Sat | 52 | 52 | 2016 | 2016 |
| 2017-01-01 | Sun | 52 | 52 | 2016 | 2016 |
| 2017-01-02 | Mon | 1 | 1 | 2017 | 2017 |
| 2017-01-03 | Tue | 1 | 1 | 2017 | 2017 |
| 2017-01-04 | Wed | 1 | 1 | 2017 | 2017 |
| 2017-01-05 | Thu | 1 | 1 | 2017 | 2017 |
| 2017-12-30 | Sat | 52 | 52 | 2017 | 2017 |
| 2017-12-31 | Sun | 52 | 52 | 2017 | 2017 |
+------------+-----+-----+-----------+------+-----------+
L’exemple suivant illustre l’effet de maintenir WEEK_OF_YEAR_POLICY à 0
, mais de remplacer WEEK_START par 3
(mercredi) :
ALTER SESSION SET WEEK_OF_YEAR_POLICY=0, WEEK_START=3;
SELECT d "Date",
DAYNAME(d) "Day",
WEEK(d) "WOY",
WEEKISO(d) "WOY (ISO)",
YEAROFWEEK(d) "YOW",
YEAROFWEEKISO(d) "YOW (ISO)"
FROM week_examples;
+------------+-----+-----+-----------+------+-----------+
| Date | Day | WOY | WOY (ISO) | YOW | YOW (ISO) |
|------------+-----+-----+-----------+------+-----------|
| 2016-12-30 | Fri | 53 | 52 | 2016 | 2016 |
| 2016-12-31 | Sat | 53 | 52 | 2016 | 2016 |
| 2017-01-01 | Sun | 53 | 52 | 2016 | 2016 |
| 2017-01-02 | Mon | 53 | 1 | 2016 | 2017 |
| 2017-01-03 | Tue | 53 | 1 | 2016 | 2017 |
| 2017-01-04 | Wed | 1 | 1 | 2017 | 2017 |
| 2017-01-05 | Thu | 1 | 1 | 2017 | 2017 |
| 2017-12-30 | Sat | 52 | 52 | 2017 | 2017 |
| 2017-12-31 | Sun | 52 | 52 | 2017 | 2017 |
+------------+-----+-----+-----------+------+-----------+
2016 compte maintenant 53 semaines (au lieu de 52).
WOY pour le 1er janvier 2017 passe à la semaine 53 (anciennement 52).
WOY pour les 2 et 3 janvier 2017 passe à la semaine 53 (anciennement 1).
YOW pour les 2 et 3 janvier 2017 passe à 2016 (anciennement 2017).
WOY (ISO) et YOW (ISO) ne sont pas concernés par le changement de paramètre.
Les deux derniers exemples définissent WEEK_OF_YEAR_POLICY sur 1
et WEEK_START en premier sur 1
(lundi) puis sur 3
(mercredi) :
ALTER SESSION SET WEEK_OF_YEAR_POLICY=1, WEEK_START=1;
SELECT d "Date",
DAYNAME(d) "Day",
WEEK(d) "WOY",
WEEKISO(d) "WOY (ISO)",
YEAROFWEEK(d) "YOW",
YEAROFWEEKISO(d) "YOW (ISO)"
FROM week_examples;
+------------+-----+-----+-----------+------+-----------+
| Date | Day | WOY | WOY (ISO) | YOW | YOW (ISO) |
|------------+-----+-----+-----------+------+-----------|
| 2016-12-30 | Fri | 53 | 52 | 2016 | 2016 |
| 2016-12-31 | Sat | 53 | 52 | 2016 | 2016 |
| 2017-01-01 | Sun | 1 | 52 | 2017 | 2016 |
| 2017-01-02 | Mon | 2 | 1 | 2017 | 2017 |
| 2017-01-03 | Tue | 2 | 1 | 2017 | 2017 |
| 2017-01-04 | Wed | 2 | 1 | 2017 | 2017 |
| 2017-01-05 | Thu | 2 | 1 | 2017 | 2017 |
| 2017-12-30 | Sat | 53 | 52 | 2017 | 2017 |
| 2017-12-31 | Sun | 53 | 52 | 2017 | 2017 |
+------------+-----+-----+-----------+------+-----------+
ALTER SESSION SET week_of_year_policy=1, week_start=3;
SELECT d "Date",
DAYNAME(d) "Day",
WEEK(d) "WOY",
WEEKISO(d) "WOY (ISO)",
YEAROFWEEK(d) "YOW",
YEAROFWEEKISO(d) "YOW (ISO)"
FROM week_examples;
+------------+-----+-----+-----------+------+-----------+
| Date | Day | WOY | WOY (ISO) | YOW | YOW (ISO) |
|------------+-----+-----+-----------+------+-----------|
| 2016-12-30 | Fri | 53 | 52 | 2016 | 2016 |
| 2016-12-31 | Sat | 53 | 52 | 2016 | 2016 |
| 2017-01-01 | Sun | 1 | 52 | 2017 | 2016 |
| 2017-01-02 | Mon | 1 | 1 | 2017 | 2017 |
| 2017-01-03 | Tue | 1 | 1 | 2017 | 2017 |
| 2017-01-04 | Wed | 2 | 1 | 2017 | 2017 |
| 2017-01-05 | Thu | 2 | 1 | 2017 | 2017 |
| 2017-12-30 | Sat | 53 | 52 | 2017 | 2017 |
| 2017-12-31 | Sun | 53 | 52 | 2017 | 2017 |
+------------+-----+-----+-----------+------+-----------+
Avec WEEK_OF_YEAR_POLICY défini sur
1
et WEEK_START défini sur1
(lundi) :WOY pour
2017-01-01
est1
.La semaine 1 est composée d’une journée.
La semaine 2 commence le
Mon
.
Ce scénario d’utilisation est généralement le plus courant.
Avec WEEK_OF_YEAR_POLICY défini sur
1
et WEEK_START défini sur3
(mercredi) :WOY pour le 01-01-2017 est toujours
1
.La semaine 1 est composée de 3 jours.
La semaine 2 commence le
Wed
.
Dans les deux exemples, WOY (ISO) et YOW (ISO) ne sont pas concernés par le changement de paramètre.