날짜 및 시간 함수¶
이 함수 집합은 DATE/TIME/TIMESTAMP 데이터를 생성, 변환, 추출 또는 수정하는 데 사용할 수 있습니다.
이 항목의 내용:
함수 목록¶
하위 카테고리 |
함수 |
참고 |
---|---|---|
생성 |
||
추출 |
모든 날짜 및 시간 부분을 허용합니다(자세한 내용은 다음 섹션 참조). |
|
DATE_PART 를 대체합니다. |
||
DATE_PART 를 대체합니다. |
||
관련 날짜 부분을 허용합니다(자세한 내용은 다음 섹션 참조). |
||
DATE_PART 를 대체합니다. |
||
덧셈/뺄셈 |
||
관련 날짜 및 시간 부분을 허용합니다(자세한 내용은 다음 섹션 참조). |
||
관련 날짜 및 시간 부분을 허용합니다(자세한 내용은 다음 섹션 참조). |
||
DATEADD 의 별칭입니다. |
||
DATEDIFF 의 별칭입니다. |
||
DATEADD 의 별칭입니다. |
||
DATEDIFF 의 별칭입니다. |
||
잘라내기 |
관련 날짜 및 시간 부분을 허용합니다(자세한 내용은 다음 섹션 참조). |
|
균일한 간격의 시작으로 시간을 “반올림”할 수 있습니다. |
||
DATE_TRUNC 를 대체합니다. |
||
변환 |
||
타임존 |
||
경고 |
||
지원되는 날짜 및 시간 부분¶
특정 함수뿐 아니라 해당 함수의 적절한 별칭과 대체 함수도 날짜 또는 시간 부분을 인자로 받습니다. 다음 두 표에는 이러한 함수와 함께 사용할 수 있는 부분(대/소문자 구분 안 함)이 나열되어 있습니다.
날짜 부분 |
약어/변형 |
DATEADD |
DATEDIFF |
DATE_PART |
DATE_TRUNC |
LAST_DAY |
---|---|---|---|---|---|---|
|
|
✔ |
✔ |
✔ |
✔ |
✔ |
|
|
✔ |
✔ |
✔ |
✔ |
✔ |
|
|
✔ |
✔ |
✔ |
✔ |
|
|
|
✔ |
||||
|
|
✔ |
||||
|
|
✔ |
||||
|
|
✔ |
✔ |
✔ |
✔ |
✔ |
|
|
✔ |
||||
|
|
✔ |
✔ |
✔ |
✔ |
✔ |
|
✔ |
|||||
|
✔ |
[1] 사용법에 대한 자세한 내용은 Snowflake가 달력상의 주와 요일을 처리하는 방법을 설명하는 다음 섹션을 참조하십시오.
[2] 다음 섹션의 설명과 같이, WEEK_START 및 WEEK_OF_YEAR_POLICY 세션 매개 변수로 제어되지 않습니다.
시간 부분 |
약어/변형 |
DATEADD |
DATEDIFF |
DATE_PART |
DATE_TRUNC |
LAST_DAY |
---|---|---|---|---|---|---|
|
|
✔ |
✔ |
✔ |
✔ |
|
|
|
✔ |
✔ |
✔ |
✔ |
|
|
|
✔ |
✔ |
✔ |
✔ |
|
|
|
✔ |
✔ |
✔ |
||
|
|
✔ |
✔ |
✔ |
||
|
|
✔ |
✔ |
✔ |
✔ |
|
|
|
✔ |
||||
|
|
✔ |
||||
|
|
✔ |
||||
|
|
✔ |
||||
|
|
✔ |
||||
|
|
✔ |
달력상의 주 및 요일¶
Snowflake에서 주 관련 함수의 동작은 WEEK_START 및 WEEK_OF_YEAR_POLICY 세션 매개 변수로 제어됩니다. 이러한 매개 변수가 상호 작용하는 방식을 이해하는 데 중요한 측면은 ISO 주의 개념입니다.
ISO 주¶
ISO 8601 표준(날짜 및 시간 형식의 경우)에 정의된 대로, ISO 주는 항상 월요일에 시작하고 그 주의 목요일을 포함하는 연도에 “속합니다”. 이것은 한 해의 하루가 다른 해의 한 주에 속할 수 있다는 의미입니다.
1월 초에 있는 날의 경우 WOY(연도의 주) 값은 52 또는 53일 수 있습니다(즉, 그날은 전년도의 마지막 주에 속함).
12월 말에 있는 날의 경우 WOY 값은 1일 수 있습니다(즉, 그날은 다음 해의 첫 번째 주에 속함).
Snowflake는 동작이 ISO 주 의미 체계 DAYOFWEEKISO , WEEKISO , YEAROFWEEKISO 와 일치하는 주 관련 날짜 함수(그리고 그와 같은 데이터 부분)로 구성된 특별한 세트를 제공합니다.
이러한 함수와 날짜 부분은 세션 매개 변수를 무시합니다(즉, 항상 ISO 의미 체계를 따름).
다른 모든 주 관련 날짜 함수가 처리되는 방법에 대한 자세한 내용은 이 항목에 있는 다음 섹션을 참조하십시오.
주의 첫째 날¶
대부분의 주 관련 함수는 WEEK_START 세션 매개 변수로만 제어됩니다. 함수 결과는 매개 변수 설정 방식에 따라 다릅니다.
함수 |
|
|
---|---|---|
|
|
|
DATE_TRUNC ( |
월요일에 시작하도록 입력 주를 자릅니다. |
해당 주의 정의된 첫째 날에 시작하도록 입력 주를 자릅니다. |
LAST_DAY ( |
입력 주의 일요일을 반환합니다. |
해당 주의 정의된 첫째 날을 기준으로 입력 주의 마지막 날을 반환합니다. |
DATEDIFF ( |
월요일에 시작하는 주를 사용하여 계산됩니다. |
해당 주의 정의된 첫째 날에 시작하는 주를 사용하여 계산됩니다. |
팁
이 매개 변수의 기본값은 0
인데, 이는 레거시 Snowflake 동작(ISO와 같은 의미 체계)을 유지하지만, 함수의 결과적인 동작을 명시적으로 제어하도록 이 값을 변경하는 것이 좋습니다. 우리가 받은 피드백을 기반으로, 가장 일반적인 시나리오는 매개 변수를 1
로 설정하는 것입니다.
올해의 첫 주/마지막 주¶
WEEK_OF_YEAR_POLICY 세션 매개 변수는 WEEK 및 YEAROFWEEK 함수가 동작하는 방식을 제어합니다. 이 매개 변수는 다음 두 가지 값을 가질 수 있습니다.
0
: 이 매개 변수가 영향을 미치는 주 관련 함수는 ISO 의미 체계와 유사한 의미 체계를 사용하므로, 해당 주의 날 중 4일 이상이 어떤 연도에 있을 경우 해당 주는 그 연도에 속합니다. 즉, 모든 주는 7일이지만 1월의 처음과 12월의 마지막에 걸친 날이 다른 연도의 한 주에 속할 수도 있다는 뜻입니다. 이러한 이유로, YEAROFWEEK 및 YEAROFWEEKISO 함수가 둘 다 해당 주가 속한 연도를 제공할 수 있습니다.1
: 1월 1일은 항상 한 해의 첫 주가 시작되는 날이고 12월 31일은 항상 한 해의 마지막 주에 속한 날입니다. 이는 곧 해당 연도의 첫 번째 주와 마지막 주는 7일 미만일 수 있다는 뜻입니다.
이 동작은 WEEK_START 세션 매개 변수에 대해 설정된 값으로 제어되는 해당 주의 시작 요일에도 영향을 받습니다.
0
,1
: 이 동작은 월요일에 한 주를 시작하는 ISO 주 의미 체계와 같습니다.2
-7
: “4일” 논리가 유지되지만, 그 주의 첫 번째 요일이 다릅니다.
팁
두 매개 변수의 기본값은 0
인데, 이는 레거시 Snowflake 동작(ISO와 같은 의미 체계)을 유지하지만, 함수의 결과적인 동작을 명시적으로 제어하도록 이들 값을 변경하는 것이 좋습니다. 우리가 받은 피드백을 기반으로, 가장 일반적인 시나리오는 두 매개 변수를 모두 1
로 설정하는 것입니다.
예¶
참고
이러한 예에서는 똑같은 날짜 함수 세트를 쿼리하지만, WEEK_OF_YEAR_POLICY 및 WEEK_START 세션 매개 변수가 함수의 결과에 어떤 영향을 미치는지 보여주기 위해 이들 매개 변수에 대해 서로 다른 값을 설정합니다.
주의 첫째 요일 제어하기¶
다음 두 가지 예에 나타낸 것처럼, WEEK_START를 0
(기존 동작) 또는 1
(월요일)로 설정하더라도 의미 있는 효과를 미치지 않습니다.
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 | +------------+-----+-----+------------+-----------+---------------+--------------+------------------------------------+
WEEK_START를
0
으로 설정한 경우 일요일의 DOW는0
입니다.WEEK_START를
1
로 설정한 경우 일요일의 DOW는7
입니다.
WEEK_START를 월요일이 아닌 다른 요일로 설정하면 결과가 더 크게 달라집니다. 예를 들어, 이 매개 변수를 3
(수요일)으로 설정하면 모든 주 관련 함수의 결과(열 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 | +------------+-----+-----+------------+-----------+---------------+--------------+------------------------------------+
연도의 첫째/마지막 주에 대한 연도 및 요일 제어하기¶
다음 예에서는 ISO와 같은 의미 체계를 따르도록 두 매개 변수를 모두 0
으로 설정합니다(즉, 한 주의 시작이 월요일이고 모든 주의 일수는 7일임).
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 | +------------+-----+-----+-----------+------+-----------+
다음 예에서는 WEEK_OF_YEAR_POLICY를 계속 0
으로 설정하지만 WEEK_START를 3
(수요일)으로 변경하는 효과를 보여줍니다.
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년에는 52주가 아니라 53주가 있습니다.
2017년 1월 1일의 WOY가 52주 차에서 53주 차로 이동합니다.
2017년 1월 2일과 3일의 WOY가 1주 차에서 53주 차로 이동합니다.
2017년 1월 2일과 3일의 YOW가 2017년에서 2016년으로 이동합니다.
WOY(ISO)와 YOW(ISO)는 매개 변수 변경의 영향을 받지 않습니다.
마지막 두 예에서는 WEEK_OF_YEAR_POLICY가 1
로 설정되고 WEEK_START는 먼저 1
(월요일)로 설정된 다음에 3
(수요일)으로 설정됩니다.
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 | +------------+-----+-----+-----------+------+-----------+
WEEK_OF_YEAR_POLICY를
1
로, WEEK_START를1
(월요일)로 설정한 경우 다음과 같습니다.
2017-01-01
의 WOY는1
입니다.1주 차는 1일로 구성됩니다.
2주 차는
Mon
에 시작됩니다.이것은 우리가 받은 피드백을 기반으로 하는 가장 일반적인 사용 시나리오입니다.
WEEK_OF_YEAR_POLICY를
1
로, WEEK_START를3
(수요일)으로 설정한 경우 다음과 같습니다.
2017-01-01의 WOY는 여전히
1
입니다.1주 차는 3일로 구성됩니다.
2주 차는
Wed
에 시작됩니다.두 예에서 모두 WOY(ISO)와 YOW(ISO)는 매개 변수 변경의 영향을 받지 않습니다.