날짜 및 시간 데이터 타입¶
Snowflake는 날짜, 시간, 타임스탬프(날짜 + 시간의 결합)를 관리하기 위한 데이터 타입을 지원합니다. Snowflake는 날짜, 시간, 타임스탬프 조작에 사용되는 문자열 상수에 대한 형식도 지원합니다.
이 항목의 내용:
데이터 타입¶
Snowflake는 다음과 같은 날짜 및 시간 데이터 타입을 지원합니다.
참고
DATE 및 TIMESTAMP 데이터의 경우 Snowflake는 1582년에서 9999년 사이의 연도를 사용할 것을 권장합니다. Snowflake는 이 범위 밖의 연도를 허용하지만, 그레고리력의 제한 으로 인해 1582년 이전 연도는 피해야 합니다.
DATE¶
Snowflake는 날짜를 저장하기 위한 단일 DATE 데이터 타입(시간 요소 없음)을 지원합니다.
DATE는 가장 일반적인 형식(YYYY-MM-DD
, DD-MON-YYYY
등)의 날짜를 허용합니다.
또한, 허용되는 모든 TIMESTAMP 값은 날짜에 대해 유효한 입력입니다. 그러나 TIME 정보는 잘립니다.
DATETIME¶
DATETIME은 TIMESTAMP_NTZ의 별칭입니다.
TIME¶
Snowflake는 시간을 HH:MI:SS
형식으로 저장하기 위한 단일 TIME 데이터를 지원합니다.
TIME은 소수 초에 대한 선택적 정밀도 매개 변수를 지원합니다(예: TIME(3)
). 시간 정밀도는 0(초)~9(나노초)의 범위로 지정할 수 있습니다. 기본 정밀도는 9입니다.
모든 TIME 값은 00:00:00
과 23:59:59.999999999
사이의 값이어야 합니다. TIME은 내부적으로 “wallclock” 시간을 저장하며 TIME 값에 대한 모든 작업은 타임존을 고려하지 않고 수행됩니다.
TIMESTAMP_LTZ , TIMESTAMP_NTZ , TIMESTAMP_TZ¶
Snowflake는 타임스탬프의 세 가지 변형을 지원합니다.
- TIMESTAMP_LTZ:
TIMESTAMP_LTZ는 내부적으로 지정된 정밀도로 UTC 시간을 저장합니다. 그러나 모든 작업은 TIMEZONE 세션 매개 변수로 제어되는 현재 세션의 타임존에서 수행됩니다.
TIMESTAMP_LTZ의 별칭:
TIMESTAMPLTZ
TIMESTAMP WITH LOCAL TIME ZONE
- TIMESTAMP_NTZ:
TIMESTAMP_NTZ는 내부적으로 지정된 정밀도로 “wallclock” 시간을 저장합니다. 모든 작업은 타임존을 고려하지 않고 수행됩니다.
출력 형식에 타임존이 포함된 경우 UTC 표시기(
Z
)가 표시됩니다.TIMESTAMP_NTZ가 TIMESTAMP의 기본값입니다.
TIMESTAMP_NTZ의 별칭:
TIMESTAMPNTZ
TIMESTAMP WITHOUT TIME ZONE
DATETIME
- TIMESTAMP_TZ:
TIMESTAMP_TZ는 연결된 타임존 오프셋 과 함께 UTC 시간을 내부적으로 저장합니다. 타임존이 제공되지 않으면 세션 타임존 오프셋이 사용됩니다. 모든 작업은 각 레코드에 특정한 타임존 오프셋으로 수행됩니다.
TIMESTAMP_TZ의 별칭:
TIMESTAMPTZ
TIMESTAMP WITH TIME ZONE
TIMESTAMP_TZ 값은 UTC의 시간을 기준으로 비교됩니다. 예를 들어 다음과 같이 서로 다른 타임존의 서로 다른 시간을 비교할 때 두 값이 UTC로는 같은 시간이므로 TRUE가 반환됩니다.
SELECT '2024-01-01 00:00:00 +0000'::TIMESTAMP_TZ = '2024-01-01 01:00:00 +0100'::TIMESTAMP_TZ;
주의
TIMESTAMP_TZ는 현재 주어진 값에 대해 생성되는 순간에 실제 타임존 이 아니라 주어진 타임존의 오프셋 만 저장합니다. 이는 UTC에서는 사용하지 않는 일광 절약 시간제의 경우 특히 중요합니다.
예를 들어 TIMEZONE 매개 변수를 "America/Los_Angeles"
로 설정한 상태에서 값을 주어진 연도의 1월에 TIMESTAMP_TZ로 변환하면 -0800
의 타임존 오프셋이 저장됩니다. 나중에 이 값에 6개월을 추가하면 7월에 로스앤젤레스에 대한 오프셋이 -0700
이더라도 -0800
오프셋이 유지됩니다. 이는 이 값이 생성된 후에는 실제 타임존 정보("America/Los_Angeles"
)를 더 이상 사용할 수 없기 때문입니다. 다음 코드 샘플에서 이 동작을 보여줍니다.
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¶
Snowflake에서 TIMESTAMP는 TIMESTAMP_* 변형 중 하나와 연결된 사용자 지정 별칭입니다. TIMESTAMP가 사용되는 모든 작업에서 연결된 TIMESTAMP_* 변형이 자동으로 사용됩니다. TIMESTAMP 데이터 타입은 테이블에 저장되지 않습니다.
TIMESTAMP와 연결된 TIMESTAMP_* 변형은 TIMESTAMP_TYPE_MAPPING 세션 매개 변수에 의해 지정됩니다. 기본값은 TIMESTAMP_NTZ입니다.
TIMESTAMP 별칭뿐 아니라 모든 타임스탬프 변형은 소수 초에 대한 선택적 정밀도 매개 변수도 지원합니다(예: TIMESTAMP(3)
). 타임스탬프 정밀도는 0(초)~9(나노초)의 범위로 지정할 수 있습니다. 기본 정밀도는 9입니다.
타임스탬프 예¶
다음 예에서는 다양한 타임스탬프를 사용하여 테이블을 만듭니다.
먼저 (TIMESTAMP_NTZ에 매핑된) TIMESTAMP 열이 있는 테이블을 만듭니다.
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 |
+------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
다음으로, 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 |
+------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
다양한 타임존과 함께 TIMESTAMP_LTZ 사용하기:
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');
이 쿼리는 1월 2일의 해당 시간이 로스앤젤레스 현지 기준 08:00(UTC 기준으로는 16:00)임을 보여줍니다.
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 |
+-------------------------------+----------+
다음으로, 이 시간은 다른 타임존에 따라 변경됩니다.
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 |
+-------------------------------+----------+
테이블을 생성하고 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');
다른 타임존의 두 가지 시간 모두 동일한 “현지” 시간으로 변환된다는 점에 유의하십시오.
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 |
+-------------------------+----------+
다음으로, 세션 타임존을 변경해도 결과에는 영향을 미치지 않습니다.
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 |
+-------------------------+----------+
테이블을 생성하고 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');
1월 1일 레코드는 세션 타임존을 상속했고 “America/Los_Angeles”는 숫자형 타임존 오프셋으로 변환되었습니다.
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 |
+-------------------------------+----------+
다음으로, 세션 타임존을 변경해도 결과에는 영향을 미치지 않습니다.
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 |
+-------------------------------+----------+
지원되는 달력¶
Snowflake는 모든 날짜와 타임스탬프에 그레고리력을 사용합니다. 그레고리력은 1582년부터 시작하는 달력이지만 이전 연도를 인식하며, 이는 Snowflake가 율리우스력과 일치하도록 1582년 이전의 날짜(또는 1582년 이전의 날짜를 포함하는 계산)를 조정하지 않으므로 유의해야 할 중요한 사항입니다. UUUU
형식 요소는 음수 연도를 지원합니다.
날짜 및 시간 형식¶
이러한 모든 데이터 타입은 가장 모호하지 않은 날짜, 시간 또는 날짜 + 시간 형식을 허용합니다. 형식을 자동으로 감지하도록 구성되어 있을 때 Snowflake가 인식하는 형식은 AUTO 감지에서 지원되는 형식 섹션을 참조하십시오.
또한 날짜 및 시간 형식을 수동으로 지정 할 수도 있습니다. 형식을 지정할 때 다음 표에 나열된 대/소문자를 구분하지 않는 요소를 사용할 수 있습니다.
형식 요소 |
설명 |
---|---|
|
4자리 숫자 연도입니다. |
|
TWO_DIGIT_CENTURY_START 세션 매개 변수로 제어되는 2자리 숫자 연도입니다. 예를 들어, |
|
2자리 숫자 월( |
|
전체 또는 간략한 월 이름입니다. |
|
전체 월 이름입니다. |
|
월의 두 자리 일( |
|
간략한 요일입니다. |
|
시간을 나타내는 두 자리 숫자( |
|
시간을 나타내는 두 자리 숫자( |
|
오전( |
|
분을 나타내는 두 자리 숫자( |
|
초를 나타내는 두 자리 숫자 ( |
|
|
|
타임존의 시 및 분이며, UTC 기준 차이입니다. |
|
ISO 형식 의 4자리 연도이며, BCE 연도의 경우 음수입니다. |
참고
날짜 전용 형식을 사용하는 경우 연결된 시간은 해당 날짜의 자정으로 간주됩니다.
큰따옴표 사이에 있는 형식이나 위 요소 이외의 형식으로 된 항목은 모두 해석되지 않고 구문 분석/형식 지정됩니다.
유효한 범위, 자릿수, 모범 사례에 대한 자세한 내용은 날짜, 시간 및 타임스탬프 형식 사용에 대한 추가 정보 섹션을 참조하십시오.
날짜 및 시간 형식 사용 예¶
다음은 FF
를 사용하여 출력의 소수 초 필드에 9자리 숫자가 있음을 나타내는 예입니다.
CREATE TABLE timestamp_demo_table(
t TIMESTAMP,
t_tz TIMESTAMP_TZ,
t_ntz TIMESTAMP_NTZ,
t_ltz TIMESTAMP_LTZ);
INSERT INTO timestamp_demo_table (t, t_tz, t_ntz, t_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 t, t_tz, t_ntz, t_ltz
FROM timestamp_demo_table;
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
| T | T_TZ | T_NTZ | T_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 |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
날짜 및 시간 상수¶
상수 (리터럴 이라고도 함)는 고정 데이터 값입니다. Snowflake는 문자열 상수를 사용하여 고정 날짜, 시간 또는 타임스탬프 값을 지정할 수 있도록 지원합니다. 문자열 상수는 항상 구분 기호 문자로 묶어야 합니다. Snowflake는 작은따옴표를 사용하여 문자열 상수를 구분할 수 있도록 지원합니다.
예:
DATE '2024-08-14'
TIME '10:03:56'
TIMESTAMP '2024-08-15 10:59:43'
이 문자열은 다음 매개 변수를 통해 설정된 바와 같이, 데이터 타입에 대한 입력 형식을 기준으로 DATE, TIME 또는 TIMESTAMP 값으로 구문 분석됩니다.
- DATE:
- TIME:
- TIMESTAMP:
예를 들어 테이블의 열에 특정 날짜를 삽입하는 방법은 다음과 같습니다.
CREATE TABLE t1 (d1 DATE);
INSERT INTO t1 (d1) VALUES (DATE '2024-08-15');
간격 상수¶
간격 상수를 사용하여 날짜, 시간 또는 타임스탬프에 기간을 더하거나 뺄 수 있습니다. 간격 상수는 다음 구문을 가진 INTERVAL 키워드를 사용하여 구현됩니다.
{ + | - } INTERVAL '<integer> [ <date_time_part> ] [ , <integer> [ <date_time_part> ] ... ]'
모든 문자열 상수와 마찬가지로, Snowflake에는 간격 상수를 구분하는 작은따옴표가 필요합니다.
INTERVAL 키워드는 정수를 하나 이상 지원하며, 선택적으로 날짜 또는 시간 부분을 하나 이상 지원합니다. 예:
INTERVAL '1 year'
는 1년을 나타냅니다.INTERVAL '4 years, 5 months, 3 hours'
는 4년, 5개월, 3시간을 나타냅니다.
날짜 또는 시간 부분을 지정하지 않을 경우 간격은 초를 나타냅니다(예: INTERVAL '2'
는 INTERVAL '2 seconds'
와 같음). 이는 날짜 산술을 수행하는 기본 시간 단위와는 다르다는 점에 유의하십시오. 자세한 내용은 날짜에 대한 간단한 산술 섹션을 참조하십시오.
지원되는 날짜 및 시간 부분의 목록은 간격에 대해 지원되는 날짜 및 시간 부분 을 참조하십시오.
참고
간격 증분 순서가 중요합니다. 나열된 순서대로 증분을 더하거나 뺍니다. 예:
INTERVAL '1 year, 1 day'
는 먼저 한 해를 더하거나 뺀 다음 하루를 더하거나 뺍니다.INTERVAL '1 day, 1 year'
는 먼저 하루를 더하거나 뺀 다음 한 해를 더하거나 뺍니다.
순서 차이는 윤년과 같은 달력 이벤트의 영향을 받는 계산에 영향을 줄 수 있습니다.
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은 데이터 타입이 아닙니다(즉, 테이블 열을 데이터 타입 INTERVAL이 되도록 정의할 수 없음). 간격은 날짜, 시간 및 타임스탬프 산술에만 사용할 수 있습니다.
SQL 변수 와 함께 간격을 사용할 수는 없습니다. 예를 들어, 다음 쿼리는 오류를 반환합니다.
SET v1 = '1 year'; SELECT TO_DATE('2023-04-15') + INTERVAL $v1;
간격에 대해 지원되는 날짜 및 시간 부분¶
INTERVAL 키워드는 다음의 날짜 및 시간 부분을 인자로 지원합니다(대/소문자 구분 안 함).
날짜 또는 시간 부분 |
약어/변형 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
간격의 예¶
특정 날짜에 연도 간격 추가하기:
SELECT TO_DATE('2023-04-15') + INTERVAL '1 year';
+-------------------------------------------+
| TO_DATE('2023-04-15') + INTERVAL '1 YEAR' |
|-------------------------------------------|
| 2024-04-15 |
+-------------------------------------------+
특정 시간에 3시간 18분 간격을 추가합니다.
SELECT TO_TIME('04:15:29') + INTERVAL '3 hours, 18 minutes';
+------------------------------------------------------+
| TO_TIME('04:15:29') + INTERVAL '3 HOURS, 18 MINUTES' |
|------------------------------------------------------|
| 07:33:29 |
+------------------------------------------------------+
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;
+-------------------------------+
| COMPLEX_INTERVAL1 |
|-------------------------------|
| 2026-11-07 18:07:19.875000001 |
+-------------------------------+
축약된 날짜/시간 부분 표기법으로 특정 날짜에 복합적 간격 추가하기:
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 |
+-------------------------------+
직원 정보 테이블을 쿼리하고 지난 2년 3개월 이내에 고용된 직원의 이름 반환하기:
SELECT name, hire_date
FROM employees
WHERE hire_date > CURRENT_DATE - INTERVAL '2 y, 3 month';
t1
로 명명된 테이블에서 ts
로 명명된 TIMESTAMP 열을 필터링하고 반환된 각각의 값에 4초 추가하기:
SELECT ts + INTERVAL '4 seconds'
FROM t1
WHERE ts > TO_TIMESTAMP('2024-04-05 01:02:03');
날짜에 대한 간단한 산술¶
간격 상수를 사용하여 날짜, 시간, 타임스탬프를 더하거나 뺄 수 있을 뿐만 아니라, { + | - }
integer
형식으로 DATE 값에 일수를 더하거나 뺄 수도 있으며, 여기서 integer
는 더하거나 뺄 일수를 지정합니다.
참고
TIME 및 TIMESTAMP 값은 아직 간단한 산술을 지원하지 않습니다.
날짜 산술의 예¶
특정 날짜에 1일 더하기:
SELECT TO_DATE('2024-04-15') + 1;
+---------------------------+
| TO_DATE('2024-04-15') + 1 |
|---------------------------|
| 2024-04-16 |
+---------------------------+
특정 날짜에서 4일 빼기:
SELECT TO_DATE('2024-04-15') - 4;
+---------------------------+
| TO_DATE('2024-04-15') - 4 |
|---------------------------|
| 2024-04-11 |
+---------------------------+
employees
로 명명된 테이블을 쿼리하고 퇴사했지만 365일 이상 근무했던 사람들의 이름 반환하기:
SELECT name
FROM employees
WHERE end_date > start_date + 365;