날짜·시간 데이터 타입

날짜·시간 데이터 타입 (Date & time data types)

Snowflake는 날짜, 시간, 타임스탬프(날짜+시간)를 관리하는 데이터 타입을 지원해요. DATE, DATETIME, TIME, TIMESTAMP_LTZ / TIMESTAMP_NTZ / TIMESTAMP_TZ, 그리고 기간(duration)을 나타내는 Interval 데이터 타입까지 폭넓게 제공해요. 이 페이지에서는 각 타입의 특징과 함께 날짜·시간 형식, 날짜 산술, 그리고 실무 예제를 정리했어요.

출처: Snowflake SQL Reference

본문

Snowflake는 날짜, 시간, 타임스탬프(결합된 날짜+시간)을 관리하기 위한 데이터 타입을 지원해요. Snowflake는 또한 날짜, 시간, 타임스탬프를 조작하는 데 사용되는 문자열 상수의 형식도 지원해요.

데이터 타입

Snowflake는 다음 날짜 및 시간 데이터 타입을 지원해요.

  • DATE
  • DATETIME
  • Interval 데이터 타입
  • TIME
  • TIMESTAMP_LTZ , TIMESTAMP_NTZ , TIMESTAMP_TZ

두 날짜 또는 시간 값 사이의 고정된 범위를 단일 반개방(half-open) [begin, end) 값으로 저장하려면 PERIOD 데이터 타입을 참고해요.

Note

DATE와 TIMESTAMP 데이터에 대해 Snowflake는 1582년부터 9999년 사이의 연도를 사용하길 권장해요. Snowflake는 이 범위 밖의 일부 연도도 허용하지만, 1582년 이전의 연도는 그레고리력(Gregorian Calendar)의 제한 때문에 피해야 해요.

DATE

Snowflake는 날짜(시간 요소 없이)를 저장하기 위한 단일 DATE 데이터 타입을 지원해요.

DATE는 가장 일반적인 형식(YYYY-MM-DD, DD-MON-YYYY 등)의 날짜를 허용해요.

또한 허용되는 모든 TIMESTAMP 값은 날짜에 대한 유효한 입력이지만, TIME 정보는 잘려요(truncated).

DATETIME

DATETIME은 TIMESTAMP_NTZ의 동의어예요.

Interval 데이터 타입

Interval 데이터 타입은 시간의 기간(duration)을 나타내는 값을 저장해요. 두 날짜 또는 시간의 차이로 interval을 계산할 수 있어요. interval은 기간만 정의하므로 시간상 시작점이나 끝점이 없어요. 예를 들어 interval을 3년 7개월로 정의할 수 있어요.

Snowflake는 interval 데이터 타입의 다음 연-월 (year-month) 변형을 지원해요.

데이터 타입 설명
INTERVAL YEAR 연 단위의 시간 기간을 나타내요.
INTERVAL YEAR TO MONTH 년과 월 단위의 시간 기간을 나타내요.
INTERVAL MONTH 월 단위의 시간 기간을 나타내요.

Snowflake는 interval 데이터 타입의 다음 일-시 (day-time) 변형을 지원해요.

데이터 타입 설명
INTERVAL DAY 일 단위의 시간 기간을 나타내요.
INTERVAL DAY TO HOUR 일과 시 단위의 시간 기간을 나타내요.
INTERVAL DAY TO MINUTE 일, 시, 분 단위의 시간 기간을 나타내요.
INTERVAL DAY TO SECOND 일, 시, 분, 초, 소수 초 단위의 시간 기간을 나타내요.
INTERVAL HOUR 시 단위의 시간 기간을 나타내요.
INTERVAL HOUR TO MINUTE 시와 분 단위의 시간 기간을 나타내요.
INTERVAL HOUR TO SECOND 시, 분, 초, 소수 초 단위의 시간 기간을 나타내요.
INTERVAL MINUTE 분 단위의 시간 기간을 나타내요.
INTERVAL MINUTE TO SECOND 분, 초, 소수 초 단위의 시간 기간을 나타내요.
INTERVAL SECOND 초와 소수 초 단위의 시간 기간을 나타내요.

다음 섹션들은 interval 데이터 타입을 더 자세히 설명해요.

  • Interval 데이터 타입의 이점
  • Interval 데이터 타입의 문법
  • Interval 값 표현
  • Interval 형식
  • Interval 값 예제
  • 날짜·시간 값이 관련된 연산
  • Interval 값을 인자로 받는 함수
  • Interval 데이터 타입 예제
  • Interval 데이터 타입의 제한 사항

Note

날짜·시간 산술에 interval 상수를 사용할 수도 있어요. 그러나 interval 상수는 컬럼 타입으로서의 interval 저장을 지원하지 않아요.

Interval 데이터 타입의 이점

Interval 데이터 타입은 다음 이점을 제공해요.

  • 모호함 없이 정확한 날짜 산술을 보장해요.
  • 정수 기반 기간을 수동으로 변환·캐스팅할 필요를 없애요.
  • 시간 간격을 나타내는 데이터를 위한 저장을 최적화해요.
  • 기간 데이터를 위한 쿼리 실행을 최적화해요.
  • Databricks, Oracle, Teradata 같은 서드파티 데이터베이스에서 데이터 마이그레이션을 단순화해요.
  • ANSI 표준을 완전히 준수해요.
Interval 데이터 타입의 문법

Interval 데이터 타입을 지정하려면 다음 문법을 사용해요.

INTERVAL { yearMonthQualifier | dayTimeQualifier }

여기서:

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>) ] ]
  }

속성:

  • _precision_은 허용되는 총 자릿수예요. 정밀도는 1부터 9까지 가능해요.

기본값: 9

  • _fractional_seconds_precision_은 초의 소수 부분 자릿수예요. 시간 정밀도는 0(초)부터 9(나노초)까지 가능해요.

기본값: 9

interval 데이터 타입을 지정할 때 이 문법을 사용해요. 예를 들어 다음 테이블은 INTERVAL YEAR TO MONTH 타입의 duration 컬럼을 가져요.

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

interval 값을 interval 리터럴 또는 interval 형식으로 표현할 수 있어요.

  • Interval 리터럴
  • Interval 형식
  • Interval 값 예제
Interval 리터럴

interval 리터럴은 문자열 리터럴로 시간의 기간을 지정하는 표현식이에요. interval 리터럴을 지정하려면 다음 문법을 사용해요.

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

여기서:

  • _sign_은 양(+) 또는 음(-)의 시간 기간을 지정하는 선택적 기호예요.

기본값: +.

  • _string_은 시간 기간을 나타내는 값이에요.
  • _yearMonthQualifier_는 Interval 데이터 타입의 문법에 정의된 qualifier예요.
  • _dayTimeQualifier_는 Interval 데이터 타입의 문법에 정의된 qualifier예요.

interval 리터럴에서 qualifier의 날짜 또는 시간 부분을 단수 또는 복수 형태로 쓸 수 있어요. 예를 들어 INTERVAL '3' DAYINTERVAL '3' DAYS는 동일해요.

SELECT '2026-04-01'::DATE + INTERVAL '3' DAYS;

+----------------------------------------+
| '2026-04-01'::DATE + INTERVAL '3' DAYS |
|----------------------------------------|
| 2026-04-04 00:00:00.000                |
+----------------------------------------+
Interval 형식

특정 형식의 문자열 리터럴이 interval 값을 표현할 수 있어요.

연도와 월의 값을 지정하려면 다음 형식을 사용해요.

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

여기서:

  • _sign_은 양(+) 또는 음(-)의 시간 기간을 지정하는 필수 기호예요.

기본값: +.

  • _Y_는 연도 수예요. 허용되는 자릿수(정밀도)는 값의 데이터 타입에 따라 달라져요.
  • _MM_00부터 11까지의 월 수를 위한 두 자리 숫자예요.

일, 시, 초, 소수 초의 값을 지정하려면 다음 형식을 사용해요.

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

여기서:

  • _sign_은 양(+) 또는 음(-)의 시간 기간을 지정하는 필수 기호예요.

기본값: +.

  • _D_는 일 수예요. 허용되는 자릿수(정밀도)는 값의 데이터 타입에 따라 달라져요.

다음 유형의 값에서는 _D_를 생략해요.

  • INTERVAL HOUR

  • INTERVAL HOUR TO MINUTE

  • INTERVAL HOUR TO SECOND

  • INTERVAL MINUTE

  • INTERVAL MINUTE TO SECOND

  • INTERVAL SECOND

  • _HH24_00부터 23까지의 시간 수를 위한 두 자리 숫자예요.

다음 유형의 값에서는 _HH24_를 생략해요.

  • INTERVAL DAY

  • INTERVAL MINUTE

  • INTERVAL MINUTE TO SECOND

  • INTERVAL SECOND

  • _MI_00부터 59까지의 분 수를 위한 두 자리 숫자예요.

다음 유형의 값에서는 _MI_를 생략해요.

  • INTERVAL DAY TO HOUR

  • INTERVAL DAY

  • INTERVAL HOUR

  • INTERVAL SECOND

  • _SS_00부터 59까지의 초 수를 위한 두 자리 숫자예요.

다음 유형의 값에서는 _SS_를 생략해요.

  • INTERVAL DAY

  • INTERVAL DAY TO HOUR

  • INTERVAL DAY TO MINUTE

  • INTERVAL HOUR

  • INTERVAL HOUR TO MINUTE

  • INTERVAL MINUTE

  • _F_는 초를 포함하는 데이터 타입의 소수 초 수예요. 허용되는 자릿수(정밀도)는 값의 데이터 타입에 따라 달라져요.

interval 형식의 문자열 리터럴에 적용되는 사용 메모:

  • 문자열 리터럴 표현은 CAST 또는 TO_CHAR 함수로 interval을 명시적으로 텍스트 문자열로 캐스트할 때 적용돼요.
  • 필드의 앞쪽 0(leading zeros)은 정밀도를 지정해요.
Interval 값 예제

다음 표는 다양한 interval 값을 표현하는 방법을 보여 줘요. 표에 표시된 값은 interval 값에 대한 다음 규칙을 준수해요.

  • 양수 값의 경우 더하기 기호 +는 interval 리터럴 값에서 선택적이지만 interval 형식 값에서는 필수예요.
  • interval 리터럴 값에서 괄호 안의 값은 정밀도, 즉 허용되는 자릿수를 지정해요. 예를 들어 YEAR(3)은 연도에 세 자리가 허용됨을 지정해요.
  • interval 형식 값에서 주 필드(선행 필드)는 선행 0을 포함하지 않아요. 종속 필드는 고정된 자릿수를 사용해요. 예를 들어 +1-08 같은 YEAR TO MONTH 값에서 연도 필드는 선행 0이 없고, 월 필드는 두 자리를 사용해요.
기간 유형 Interval 리터럴 값 Interval 형식 값
양의 5년 INTERVAL YEAR INTERVAL '5' YEAR(2) '+5'
양의 1년 8개월 INTERVAL YEAR TO MONTH INTERVAL '1-08' YEAR(3) TO MONTH '+001-08'
음의 5개월 INTERVAL MONTH INTERVAL '-5' MONTH(2) '-5'
양의 14개월 INTERVAL MONTH INTERVAL '14' MONTH(2) '+14'
음의 44년 11개월 INTERVAL YEAR TO MONTH INTERVAL '-44-11' YEAR(2) TO MONTH '-44-11'
양의 11일 10시간 9분 INTERVAL DAY TO MINUTE INTERVAL '11 10:09' DAY(2) TO MINUTE '+11 10:09'
양의 2일 23시간 8분 23초 275밀리초 INTERVAL DAY TO SECOND INTERVAL '02 23:08:23.275' DAY(2) TO SECOND(3) '+2 23:08:23.275'
양의 4초 300밀리초 INTERVAL SECOND INTERVAL '4.3' SECOND(5, 6) '+4.300000'
날짜·시간 값이 관련된 연산

다음 표는 interval 값을 포함하는 유효한 산술 연산의 결과 데이터 타입을 보여 줘요.

첫 번째 피연산자 연산자 두 번째 피연산자 결과 유형
Timestamp - Timestamp Interval 데이터 타입
Date 또는 timestamp + Interval DATE, DATETIME, TIMESTAMP_LTZ, TIMESTAMP_NTZ, TIMESTAMP_TZ
Date 또는 timestamp - Interval DATE, DATETIME, TIMESTAMP_LTZ, TIMESTAMP_NTZ, TIMESTAMP_TZ
Interval + Date 또는 timestamp DATE, DATETIME, TIMESTAMP_LTZ, TIMESTAMP_NTZ, TIMESTAMP_TZ
Numeric * Interval Interval 데이터 타입
Interval * Numeric Interval 데이터 타입
Interval / Numeric Interval 데이터 타입
Interval + Interval Interval 데이터 타입
Interval - Interval Interval 데이터 타입

두 interval 값을 포함하는 연산의 경우, 두 값 모두 연-월 interval 값이어야 하거나, 둘 다 일-시 interval 값이어야 해요. 연-월 interval 값과 일-시 interval 값을 혼합하는 연산은 지원되지 않아요. 연산이 두 연-월 interval 값을 포함하면 결과 유형은 연-월 interval 타입이에요. 연산이 두 일-시 interval 값을 포함하면 결과 유형은 일-시 interval 타입이에요.

Interval 값을 인자로 받는 함수

다음 함수들은 interval 값을 인자로 받아요.

Interval 데이터 타입 예제

다음 예제들은 interval 데이터 타입을 사용하는 방법을 보여 줘요.

  • interval 데이터로 산술 수행
  • 연-월 interval 데이터 삽입·쿼리
  • 일-시 interval 데이터 삽입·쿼리
  • interval 데이터를 테이블로 복사하고 쿼리
interval 데이터로 산술 수행

다음 예제들은 interval 데이터로 산술을 수행해요.

날짜에 1년 1개월 더하기:

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                   |
+------------------------------+

날짜에서 1년 1개월 빼기:

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                   |
+------------------------------+

타임스탬프에 시간 기간 더하기:

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  |
+--------------------------+

다음 예제는 SYSTEM$TYPEOF 함수를 사용해 두 타임스탬프 값을 빼면 INTERVAL DAY TO SECOND 값이 반환됨을 보여 줘요.

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] |
+------------------------------------+

쿼리 결과를 interval 형식으로 보려면 표현식을 INTERVAL DAY(2) TO SECOND(2) 데이터 타입으로 캐스트해 정밀도를 지정한 다음 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        |
+------------------------+
연-월 interval 데이터 삽입·쿼리

INTERVAL YEAR TO MONTH 컬럼으로 채용 후보를 추적하는 테이블을 만들고 데이터를 삽입해요.

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');

컬럼을 데이터 타입으로 캐스트하지 않고 테이블을 쿼리하면, 출력은 각 행의 컬럼 값을 총 개월 수로 보여 줘요.

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 |
+------------+-----------+----------------------+

테이블을 쿼리하고 duration_of_experience 컬럼을 VARCHAR 데이터 타입으로 캐스트하면, 출력은 컬럼 값을 interval 형식으로 보여 줘요.

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                  |
+------------+-----------+------------------------+
일-시 interval 데이터 삽입·쿼리

INTERVAL HOUR TO SECOND 컬럼으로 다양한 소프트웨어 기능의 타임아웃 기간을 지정하는 테이블을 만들고 데이터를 삽입해요.

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');

테이블을 쿼리하고 timeout_duration 컬럼을 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         |
+----------+------------------+
interval 데이터를 테이블로 복사하고 쿼리

interval 데이터가 있는 파일을 스테이징한 다음 파일을 테이블로 복사하려면 다음 단계를 완료해요.

  1. 파일 시스템의 파일에 다음 내용을 복사해요.
1,1-2,28 16:15:14.0
2,-3-2,-54 16:15:14.123

이 예제는 파일이 /examples/intervals/ 디렉터리에 interval_values.csv라는 이름으로 있다고 가정해요.

  1. 스테이지를 만들어요:
CREATE STAGE interval_stage;
  1. 내부 스테이징 위치에 파일을 스테이징해요.
PUT file:///examples/intervals/interval_values.csv @~/interval_stage
  AUTO_COMPRESS=false;
  1. 데이터용 테이블을 만들어요:
CREATE OR REPLACE TABLE sample_interval_values(
  c1 STRING,
  c2 INTERVAL YEAR(1) TO MONTH,
  c3 INTERVAL DAY(2) TO SECOND(3));
  1. 스테이징된 파일을 만든 테이블에 로드하려면 COPY INTO 명령을 사용해요.
    COPY INTO sample_interval_values FROM @~/interval_stage;
    
    1. 로드된 데이터를 보려면 VARCHAR 타입으로 캐스트해 테이블을 쿼리해요.
    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 |
    +----+---------------+------------------+
    
    Interval 데이터 타입의 제한 사항

    Interval 데이터 타입에는 다음 제한 사항이 적용돼요.

    TIME

    Snowflake는 HH:MI:SS 형태의 시간을 저장하기 위한 단일 TIME 데이터 타입을 지원해요.

    TIME은 소수 초를 위한 선택적 정밀도 파라미터를 지원해요(예: TIME(3)). 시간 정밀도는 0(초)부터 9(나노초)까지 가능해요. 기본 정밀도는 9예요.

    모든 TIME 값은 00:00:0023:59:59.999999999 사이여야 해요. TIME은 내부적으로 "벽시계(wallclock)" 시간을 저장하며, TIME 값에 대한 모든 연산은 어떤 시간대도 고려하지 않고 수행돼요.

    TIMESTAMP_LTZ , TIMESTAMP_NTZ , TIMESTAMP_TZ

    Snowflake는 세 가지 timestamp 변형을 지원해요.

    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는 내부적으로 연결된 시간대 오프셋(time zone offset) 과 함께 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는 현재 주어진 값이 생성된 순간에, 실제 시간대(time zone) 가 아니라 그 시간대의 오프셋(offset) 만 저장해요. 이는 일광 절약 시간(daylight saving time)에 특히 중요하며, 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 별칭은 소수 초를 위한 선택적 정밀도 파라미터를 지원해요(예: TIMESTAMP(3)). timestamp 정밀도는 0(초)부터 9(나노초)까지 가능해요. 기본 정밀도는 9예요.

    Timestamp 예제

    이 예제들은 서로 다른 timestamp를 사용해 테이블을 만들어요.

    먼저 TIMESTAMP 컬럼(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           |
    +------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
    

    다음으로 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는 모든 날짜와 타임스탬프에 그레고리력(Gregorian Calendar)을 사용해요. 그레고리력은 1582년에 시작하지만 이전 연도도 인식해요. Snowflake는 1582년 이전의 날짜(또는 1582년 이전의 날짜를 포함한 계산)를 율리우스력(Julian Calendar)과 일치하도록 조정하지 않으므로 이 점이 중요해요. UUUU 형식 요소는 음수 연도를 지원해요.

    날짜 및 시간 형식

    이 모든 데이터 타입은 대부분의 모호하지 않은 날짜, 시간, 또는 날짜+시간 형식을 허용해요. 자동으로 형식을 감지하도록 구성할 때 Snowflake가 인식하는 형식은 AUTO 감지를 위한 지원 형식을 참고해요.

    날짜 및 시간 형식을 수동으로 지정할 수도 있어요. 형식을 지정할 때 다음 표에 나열된 대소문자를 구분하지 않는 요소를 사용할 수 있어요.

    형식 요소 설명
    YYYY 네 자리 [1] 연도.
    YY 두 자리 [1] 연도. TWO_DIGIT_CENTURY_START 세션 파라미터로 제어돼요. 예를 들어 1980으로 설정하면 값 7980은 각각 20791980으로 파싱돼요.
    Y 선행 0이 없는 한 자리 또는 두 자리 [2] 연도. TWO_DIGIT_CENTURY_START 세션 파라미터로 제어돼요. 예를 들어 파라미터가 1990으로 설정되면 값 20051991은 각각 591로 직렬화돼요.
    MM 두 자리 [1] 월(01 = 1월, 등).
    MO 선행 0이 없는 한 자리 또는 두 자리 [2] 월(1 = 1월, 등).
    MON 축약된 월 이름 [3].
    MMMM 전체 월 이름 [3].
    DD 두 자리 [1] 일(01~31).
    D 선행 0이 없는 한 자리 또는 두 자리 [2] 일(1~31).
    DY 축약된 요일.
    HH24 시간을 위한 두 자리 1. AM / PM 또는 A / P를 지정하면 안 돼요.
    HH12 시간을 위한 두 자리 1. AM / PM 또는 A / P를 지정할 수 있어요.
    H24 선행 0이 없는 한 자리 또는 두 자리 [2] 시간(0~23). AM / PM 또는 A / P를 지정하면 안 돼요.
    H12 선행 0이 없는 한 자리 또는 두 자리 [2] 시간(1~12). AM / PM 또는 A / P를 지정할 수 있어요.
    AM , PM 오전(AM) / 오후(PM). HH12H12에만 사용해요(HH24H24에는 아니요).
    P 오전(A) / 오후(P). HH12H12에만 사용해요(HH24H24에는 아니요).
    HH HH24의 동의어.
    H H24의 동의어.
    MI 분을 위한 두 자리 1.
    ME 선행 0이 없는 한 자리 또는 두 자리 [2] 분(0~59).
    SS 초를 위한 두 자리 1.
    S 선행 0이 없는 한 자리 또는 두 자리 [2] 초(0~59).
    FF[0-9] 정밀도 0(초)부터 9(나노초)의 소수 초. 예: FF, FF0, FF3, FF9. FF를 지정하는 것은 FF9(나노초)와 같아요.
    TZH:TZM , TZHTZM , TZH UTC에서 오프셋된 두 자리 [1] 시간대 시와 분. 기호를 위해 +/-가 접두될 수 있어요.
    UUUU ISO 형식의 네 자리 연도. BCE 연도에는 음수예요.

    [1] 자릿수는 값을 텍스트로 직렬화할 때 생성되는 출력을 설명해요. 텍스트를 파싱할 때 Snowflake는 지정된 자릿수까지 허용해요. 예를 들어 일 수는 한 자리 또는 두 자리일 수 있어요.

    [2] 자릿수는 값을 텍스트로 직렬화할 때 생성되는 출력을 설명해요: 값을 선행 0 없이 직렬화해요. 텍스트를 파싱할 때 Snowflake는 한 자리 또는 두 자리를 허용해요.

    [3] MON 형식 요소의 경우 값을 텍스트로 직렬화할 때 생성되는 출력은 축약된 월 이름이에요. MMMM 형식 요소의 경우 값을 텍스트로 직렬화할 때 생성되는 출력은 전체 월 이름이에요. 텍스트를 파싱할 때 Snowflake는 MON과 MMMM 모두에 대해 세 글자 축약 또는 전체 월 이름을 허용해요. 예를 들어 파싱할 때 "January" 또는 "Jan", "February" 또는 "Feb" 등이 허용돼요.

    Note

    • 날짜 전용 형식이 사용되면 연결된 시간은 그날 자정으로 가정돼요.
    • 큰따옴표 사이의 또는 위 요소가 아닌 형식의 모든 것은 해석 없이 파싱/포맷돼요. Snowflake는 리터럴 문자를 항상 큰따옴표 안에 넣는 것을 권장해요(예: "T", "EST", "Z") 그래야 리터럴로 취급되기 때문이에요.
    • 유효한 범위, 자릿수, 모범 사례에 대한 자세한 내용은 날짜·시간·타임스탬프 형식 사용에 대한 추가 정보를 참고해요.

    날짜 및 시간 형식 사용 예제

    다음 예제는 FF를 사용해 출력이 소수 초 필드에 9자리를 가짐을 나타내요.

    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 |
    +-------------------------------+-------------------------------+-------------------------------+-------------------------------+
    

    날짜 및 시간 상수

    상수(constants) ( 리터럴(literals) 이라고도 함)는 고정 데이터 값이에요. Snowflake는 고정 날짜, 시간, 타임스탬프 값을 지정하기 위해 문자열 상수 사용을 지원해요. 문자열 상수는 항상 구분 문자 사이에 있어야 해요. Snowflake는 문자열 상수를 구분하는 데 작은따옴표 사용을 지원해요.

    예를 들어:

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

    문자열은 다음 파라미터를 통해 설정된 데이터 타입의 입력 형식에 따라 DATE, TIME 또는 TIMESTAMP 값으로 파싱돼요.

    DATE:

    DATE_INPUT_FORMAT

    TIME:

    TIME_INPUT_FORMAT

    TIMESTAMP:

    TIMESTAMP_INPUT_FORMAT

    예를 들어 테이블의 컬럼에 특정 날짜를 삽입하려면:

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

    Interval 상수

    interval 상수를 사용해 날짜, 시간 또는 타임스탬프에 시간 기간을 더하거나 뺄 수 있어요. interval 상수는 INTERVAL 키워드로 구현되며, 다음 문법을 가져요.

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

    모든 문자열 상수와 마찬가지로 Snowflake는 interval 상수를 구분하는 데 작은따옴표를 요구해요.

    Note

    interval 상수는 날짜·시간 산술을 지원하지만, 컬럼 타입으로서의 interval 저장은 지원하지 않아요. 컬럼에 interval 값을 저장하려면 interval 데이터 타입을 사용할 수 있어요.

    INTERVAL 키워드는 하나 이상의 정수와, 선택적으로 하나 이상의 날짜 또는 시간 부분을 지원해요. 예를 들어:

    • INTERVAL '1 year'는 1년을 나타내요.
    • INTERVAL '4 years, 5 months, 3 hours'는 4년 5개월 3시간을 나타내요.

    날짜 또는 시간 부분이 지정되지 않으면 interval은 초를 나타내요(예: INTERVAL '2'INTERVAL '2 seconds'와 같아요). 이 점은 날짜 산술 수행의 기본 시간 단위와 다르다는 것에 주의해요. 자세한 내용은 날짜에 대한 단순 산술을 참고해요.

    지원되는 날짜·시간 부분 목록은 Interval에 대한 지원되는 날짜·시간 부분을 참고해요.

    Note

    • interval 증가분의 순서는 중요해요. 증가분은 나열된 순서대로 더하거나 빼져요. 예를 들어:
      • INTERVAL '1 year, 1 day'는 먼저 1년을 더하거나 빼고 그다음 하루를 더하거나 빼요.
      • INTERVAL '1 day, 1 year'는 먼저 하루를 더하거나 빼고 그다음 1년을 더하거나 빼요.

    순서 차이는 윤년 같은 달력 이벤트의 영향을 받는 계산에 영향을 줄 수 있어요.

    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 데이터 타입으로 정의할 수 없어요). Interval은 날짜, 시간, 타임스탬프 산술에서만 사용할 수 있어요.
    • interval을 SQL 변수와 함께 사용할 수 없어요. 예를 들어 다음 쿼리는 오류를 반환해요.
    SET v1 = '1 year';
    
    SELECT TO_DATE('2023-04-15') + INTERVAL $v1;
    

    Interval에 대한 지원되는 날짜·시간 부분

    INTERVAL 키워드는 다음 날짜·시간 부분을 인자로 지원해요(대소문자 구분 안 함).

    날짜 또는 시간 부분 약어 / 변형
    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

    Interval 예제

    특정 날짜에 1년 interval 더하기:

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

    특정 시간에 3시간 18분 interval 더하기:

    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 함수의 출력에 복잡한 interval 더하기:

    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;
    

    다음은 샘플 출력이에요. 현재 timestamp가 다르면 출력도 달라요.

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

    축약된 날짜/시간 부분 표기로 복잡한 interval을 특정 날짜에 더하기:

    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');
    

    날짜에 대한 단순 산술

    interval 상수를 사용해 날짜, 시간, 타임스탬프에 더하고 빼는 것 외에도, DATE 값에 일을 더하고 뺄 수 있어요. 형식은 { + | - } _integer_이며, 여기서 _integer_는 더하거나 뺄 일 수를 지정해요.

    Note

    TIME과 TIMESTAMP 값은 아직 단순 산술을 지원하지 않아요.

    날짜 산술 예제

    특정 날짜에 하루 더하기:

    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;
    

    더 알아보기 (Learn more)