Datums- und Uhrzeitfunktionen¶
Diese Funktionsfamilie kann verwendet werden, um Datums-, Zeit- und Zeitstempeldaten zu erstellen, zu konvertieren, zu extrahieren oder zu ändern.
Unter diesem Thema:
Liste der Funktionen¶
Unterkategorie |
Funktion |
Anmerkungen |
---|---|---|
Erstellen |
||
Extrahieren |
Akzeptiert alle Datums- und Zeitangaben (siehe Unterstützte Datums- und Uhrzeitkomponenten). |
|
Alternative zu DATE_PART. |
||
Alternative zu DATE_PART. |
||
Akzeptiert relevante Datumskomponenten (siehe Unterstützte Datums- und Uhrzeitkomponenten). |
||
Alternative zu DATE_PART. |
||
Hinzufügen/Entfernen |
||
Akzeptiert relevante Datums- und Zeitangaben (siehe Unterstützte Datums- und Uhrzeitkomponenten). |
||
Akzeptiert relevante Datums- und Zeitangaben (siehe Unterstützte Datums- und Uhrzeitkomponenten). |
||
Alias für DATEADD. |
||
Alias für DATEDIFF. |
||
Alias für DATEADD. |
||
Alias für DATEDIFF. |
||
Kürzen |
Akzeptiert relevante Datums- und Zeitangaben (siehe Unterstützte Datums- und Uhrzeitkomponenten). |
|
Ermöglicht das „Runden“ einer Zeit auf den Beginn eines gleichmäßig verteilten Intervalls. |
||
Alternative zu DATE_TRUNC. |
||
Konvertieren |
Unterstützt Konvertierungen auf der Basis von Zeichenfolge-, Zeitstempel- und VARIANT-Ausdrücken. Unterstützt Ganzzahlen für Konvertierungen basierend auf dem Beginn der Unix-Epoche. |
|
Unterstützt Konvertierungen auf der Basis von Zeichenfolge-, Zeitstempel- und VARIANT-Ausdrücken. Unterstützt Ganzzahlen für Konvertierungen basierend auf dem Beginn der Unix-Epoche. |
||
Unterstützt Konvertierungen auf der Basis von Zeichenfolge-, Datums-, Zeitstempel- und VARIANT-Ausdrücken. Unterstützt numerische Ausdrücke und Ganzzahlen für Konvertierungen basierend auf dem Beginn der Unix-Epoche. |
||
Zeitzone |
||
Alerts |
||
Ausgabeformate¶
Mehrere Funktionen für Datum und Uhrzeit geben Datums-, Zeit- und Zeitstempelwerte zurück. Die folgenden Sitzungsparameter bestimmen das Format der Ausgabe, die von diesen Funktionen zurückgegeben wird:
Das Anzeigeformat für Zeitwerte wird durch den TIME_OUTPUT_FORMAT Sitzungsparameter Das Anzeigeformat für Datumswerte in der Ausgabe wird durch den Sitzungsparameter bestimmt (Standard
HH24:MI:SS
).Das Anzeigeformat für Datumswerte in der Ausgabe wird durch den Sitzungsparameter DATE_OUTPUT_FORMAT bestimmt (Standard
YYYY-MM-DD
).Das Format für die Anzeige von Zeitstempeln wird durch den Datentyp des Zeitstempels bestimmt, den die Funktion zurückgibt. Die folgenden Sitzungsparameter legen das Ausgabeformat für verschiedene Zeitstempeldatentypen fest:
Weitere Informationen dazu finden Sie unter Eingabe- und Ausgabeformate für Datum und Uhrzeit.
Unterstützte Datums- und Uhrzeitkomponenten¶
Bestimmte Funktionen (sowie die entsprechenden Aliasse und Alternativen) akzeptieren eine Datums- oder Uhrzeitkomponente als Argument. In den folgenden beiden Tabellen sind die Teile aufgeführt (Groß-/Kleinschreibung wird nicht berücksichtigt), die Sie mit diesen Funktionen verwenden können.
Datumskomponenten |
Abkürzungen/Varianten |
DATEADD |
DATEDIFF |
DATE_PART |
DATE_TRUNC |
LAST_DAY |
---|---|---|---|---|---|---|
|
|
✔ |
✔ |
✔ |
✔ |
✔ |
|
|
✔ |
✔ |
✔ |
✔ |
✔ |
|
|
✔ |
✔ |
✔ |
✔ |
|
|
|
✔ |
||||
|
|
✔ |
||||
|
|
✔ |
||||
|
|
✔ |
✔ |
✔ |
✔ |
✔ |
|
|
✔ |
||||
|
|
✔ |
✔ |
✔ |
✔ |
✔ |
|
✔ |
|||||
|
✔ |
[1] Details zur Nutzung finden Sie im nächsten Abschnitt, in dem beschrieben wird, wie Snowflake mit Kalenderwochen und Wochentagen umgeht.
[2] Nicht durch die Sitzungsparameter WEEK_START und WEEK_OF_YEAR_POLICY gesteuert, wie im nächsten Abschnitt beschrieben.
Uhrzeitkomponenten |
Abkürzungen/Varianten |
DATEADD |
DATEDIFF |
DATE_PART |
DATE_TRUNC |
LAST_DAY |
---|---|---|---|---|---|---|
|
|
✔ |
✔ |
✔ |
✔ |
|
|
|
✔ |
✔ |
✔ |
✔ |
|
|
|
✔ |
✔ |
✔ |
✔ |
|
|
|
✔ |
✔ |
✔ |
||
|
|
✔ |
✔ |
✔ |
||
|
|
✔ |
✔ |
✔ |
✔ |
|
|
|
✔ |
||||
|
|
✔ |
||||
|
|
✔ |
||||
|
|
✔ |
||||
|
|
✔ |
||||
|
|
✔ |
Kalenderwochen und Wochentage¶
Das Verhalten wochenbezogener Funktionen in Snowflake wird durch die Sitzungsparameter WEEK_START und WEEK_OF_YEAR_POLICY gesteuert. Ein wichtiger Aspekt zum Verstehen, wie diese Parameter zusammenwirken, ist das Konzept der ISO-Wochen.
ISO-Wochen¶
Wie im ISO 8601-Standard (für Datums- und Uhrzeitformate) definiert, beginnen ISO-Wochen immer am Montag und „gehören“ zu dem Jahr, in dem sich der Donnerstag dieser Woche befindet. Das bedeutet, dass ein Tag in einem Jahr zu einer Woche eines anderen Jahres gehören kann:
Für Tage Anfang Januar kann der WOY-Wert (Woche des Jahres) 52 oder 53 betragen (d. h. der Tag gehört zur letzten Woche des Vorjahres).
Für Tage Ende Dezember kann der WOY-Wert 1 sein (d. h. der Tag gehört zur ersten Woche des nächsten Jahres).
Snowflake bietet einen speziellen Satz wochenbezogener Datumsfunktionen (und äquivalente Datumskomponenten), deren Verhalten mit der ISO-Wochensemantik übereinstimmt: DAYOFWEEKISO, WEEKISO und YEAROFWEEKISO.
Diese Funktionen (und Datumskomponenten) ignorieren die Sitzungsparameter (d. h. sie folgen immer der ISO-Semantik).
Weitere Details zur Behandlung der anderen wochenbezogenen Datumsfunktionen finden Sie in den nächsten Abschnitten:
Erster Tag der Woche¶
Die meisten wochenbezogenen Funktionen werden nur vom Sitzungsparameter WEEK_START gesteuert. Die Funktionsergebnisse unterscheiden sich je nach Einstellung dieses Parameters:
Funktion |
Parameter auf |
Parameter auf |
---|---|---|
Gibt |
Gibt |
|
DATE_TRUNC (mit einem |
Kürzt die Eingabewoche, sodass sie am Montag beginnt. |
Kürzt die Eingabewoche, sodass sie am definierten ersten Tag der Woche beginnt. |
LAST_DAY (mit einem |
Gibt den Sonntag der Eingabewoche zurück. |
Gibt den letzten Tag der Eingabewoche bezogen auf den definierten ersten Tag der Woche zurück. |
DATEDIFF (mit einem |
Führt Berechnungen mit Wochen aus, die am Montag beginnen. |
Führt Berechnungen mit Wochen aus, die am definierten ersten Tag der Woche beginnen. |
Tipp
Der Standardwert für den Parameter ist 0
, sodass das frühere Snowflake-Verhalten (ISO-ähnliche Semantik) beibehalten wird. Wir empfehlen jedoch, diesen Wert zu ändern, um das resultierende Verhalten der Funktionen explizit zu steuern. Das häufigste Szenario ist die Einstellung des Parameters auf 1
.
Erste und letzte Woche des Jahres¶
Der Sitzungsparameter WEEK_OF_YEAR_POLICY steuert, wie sich die Funktionen WEEK und YEAROFWEEK verhalten. Der Parameter kann zwei Werte haben:
0
: Die betroffenen wochenbezogenen Funktionen verwenden eine Semantik ähnlich der ISO-Semantik, bei der eine Woche zu einem bestimmten Jahr gehört, wenn mindestens 4 Tage dieser Woche in diesem Jahr liegen. Das bedeutet, dass alle Wochen 7 Tage haben, aber die ersten Tage im Januar und die letzten Tage im Dezember können zu einer Woche in einem anderen Jahr gehören. Aus diesem Grund können die beiden Funktionen YEAROFWEEK und YEAROFWEEKISO das Jahr angeben, zu dem die Woche gehört.1
: Der 1. Januar beginnt immer in der ersten Woche des Jahres, und der 31. Dezember liegt immer in der letzten Woche des Jahres. Das bedeutet, dass die erste Woche und die letzte Woche des Jahres weniger als 7 Tage haben können.
Dieses Verhalten wird auch durch den Starttag der Woche beeinflusst, der durch den für den Sitzungsparameter WEEK_START festgelegten Wert gesteuert wird:
0
oder1
: Die Verhaltensweise entspricht der ISO-Wochensemantik, wobei die Woche am Montag beginnt.2
bis7
: Die 4-Tage-Logik bleibt erhalten, aber der erste Tag der Woche ist anders.
Tipp
Der Standardwert für beide Parameter ist 0
, sodass das frühere Snowflake-Verhalten (ISO-ähnliche Semantik) beibehalten wird. Wir empfehlen jedoch, diese Werte zu ändern, um das resultierende Verhalten der Funktionen explizit zu steuern. In der Regel werden beide Parameter auf 1
festgelegt.
Beispiele¶
In diesen Beispielen wird der gleiche Satz von Datumsfunktionen abgefragt, wobei jedoch für die Sitzungsparameter WEEK_OF_YEAR_POLICY und WEEK_START unterschiedliche Werte festgelegt sind, um zu veranschaulichen, wie sie die Ergebnisse der Funktionen beeinflussen.
Die Beispiele verwenden die folgenden Daten:
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');
Festlegen des ersten Tages der Woche¶
Das Einstellen von WEEK_START auf 0
(früheres Verhalten) oder 1
(Montag) hat keinen signifikanten Effekt, wie die beiden folgenden Beispiele zeigen:
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 |
+------------+-----+-----+------------+-----------+---------------+--------------+------------------------------------+
Wenn WEEK_START auf
0
gesetzt ist, ist der DOW für Sonntag0
.Wenn WEEK_START auf
1
gesetzt ist, ist der DOW für Sonntag7
.
Die Ergebnisse unterscheiden sich deutlicher, wenn WEEK_START auf einen anderen Tag als Montag gesetzt wird. Wenn Sie beispielsweise den Parameter auf 3
(Mittwoch) setzen, werden die Ergebnisse aller wochenbezogenen Funktionen (Spalten 3 bis 8) geändert:
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 |
+------------+-----+-----+------------+-----------+---------------+--------------+------------------------------------+
Festlegen des Jahres und der Tage für die erste/letzte Woche des Jahres¶
Im folgenden Beispiel werden beide Parameter auf 0
gesetzt, um ISO-ähnlicher Semantik zu folgen (d. h. Woche beginnt am Montag und alle Wochen haben 7 Tage):
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 |
+------------+-----+-----+-----------+------+-----------+
Das nächste Beispiel veranschaulicht den Effekt, wenn WEEK_OF_YEAR_POLICY auf 0
gesetzt bleibt, aber WEEK_START in 3
(Mittwoch) geändert wird:
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 hat jetzt 53 Wochen (statt 52).
WOY für den 1. Januar 2017 wechselt zu Woche 53 (von 52).
WOY für den 2. und 3. Januar 2017 wechselt zu Woche 53 (von 1).
YOW für den 2. und 3. Januar 2017 wechselt zu 2016 (von 2017).
WOY (ISO) und YOW (ISO) sind von der Parameteränderung nicht betroffen.
In den letzten beiden Beispiele werden WEEK_OF_YEAR_POLICY auf 1
und WEEK_START zunächst auf 1
(Montag) und dann auf 3
(Mittwoch) gesetzt:
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 |
+------------+-----+-----+-----------+------+-----------+
Wenn WEEK_OF_YEAR_POLICY auf
1
und WEEK_START auf1
(Montag) gesetzt ist:WOY für
2017-01-01
ist1
.Woche 1 besteht aus 1 Tag.
Woche 2 beginnt am
Mon
.
Dieses Nutzungsszenario ist in der Regel das häufigste.
Wenn WEEK_OF_YEAR_POLICY auf
1
und WEEK_START auf3
(Mittwoch) gesetzt ist:WOY für den 01.01.2017 ist immer noch
1
.Woche 1 besteht aus 3 Tagen.
Woche 2 beginnt am
Wed
.
In beiden Beispielen sind WOY (ISO) und YOW (ISO) von der Parameteränderung nicht betroffen.