날짜 및 시간 데이터 타입

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와 동의어입니다.

간격 데이터 타입

간격 데이터 타입은 기간을 나타내는 값을 저장합니다. 간격은 두 날짜 또는 시간 간의 차이로 계산할 수 있습니다. 간격은 기간만 정의하므로 시작 또는 종료 시점이 없습니다. 예를 들어, 간격을 3년 7개월로 정의할 수 있습니다.

Snowflake는 간격 데이터 타입의 다음 연도별 변형을 지원합니다.

데이터 타입

설명

INTERVAL YEAR

기간을 연도 단위로 나타냅니다.

INTERVAL YEAR TO MONTH

기간을 연도 및 월 단위로 나타냅니다.

INTERVAL MONTH

기간을 월 단위로 나타냅니다.

Snowflake는 다음과 같은 간격 데이터 타입의 일-시간 변형을 지원합니다.

데이터 타입

설명

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

기간을 초 및 소수 자리 초 단위로 나타냅니다.

다음 섹션에서는 간격 데이터 타입을 더 자세히 설명합니다.

참고

날짜 및 시간 산술의 경우 :ref:`간격 상수 <label-interval_constants>`를 사용할 수도 있습니다. 그러나 간격 상수는 간격 저장소를 열 유형으로 지원하지 않습니다.

간격 데이터 타입의 이점

간격 데이터 타입은 다음과 같은 이점을 제공합니다.

  • 모호성 없이 정확한 날짜 산술을 보장합니다.

  • 정수 기반 기간의 수동 변환 및 캐스팅 작업의 필요성을 제거합니다.

  • 시간 간격을 나타내는 데이터의 저장소를 최적화합니다.

  • 기간 데이터에 대한 쿼리 실행을 최적화합니다.

  • Databricks, Oracle, Teradata와 같은 서드 파티 데이터베이스에서 데이터 마이그레이션을 간소화합니다.

  • ANSI 표준을 완전히 준수합니다.

간격 데이터 타입의 구문

간격 데이터 타입을 지정하려면 다음 구문을 사용합니다.

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

속성:

  • :samp:`{precision}`은 허용되는 총 자릿수입니다. 전체 자릿수는 ``1``~``9``의 범위로 지정할 수 있습니다.

    기본값: 9

  • :samp:`{fractional_seconds_precision}`은 초의 소수 부분에 있는 자릿수입니다. 시간 전체 자릿수는 ``0``(초)~``9``(나노초)의 범위로 지정할 수 있습니다.

    기본값: 9

간격 데이터 타입을 지정할 때 이 구문을 사용합니다. 예를 들어, 다음 테이블에는 INTERVAL YEAR TO MONTH 유형의 duration 열이 있습니다.

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

간격 값 표현하기

간격 리터럴 또는 간격 형식을 사용하여 간격 값을 나타낼 수 있습니다.

간격 리터럴

간격 리터럴은 문자열 리터럴에서 기간을 지정하는 식입니다. 다음 구문을 사용하여 간격 리터럴을 지정합니다.

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

여기서

  • sign`은 양수(:code:`+) 또는 음수(-) 기간을 지정하는 선택적 기호입니다.

    기본값: +.

  • :samp:`{string}`은 기간을 나타내는 값입니다.

  • :samp:`{yearMonthQualifier}`는 :ref:`label-interval_syntax`에 정의된 한정자입니다.

  • :samp:`{dayTimeQualifier}`는 :ref:`label-interval_syntax`에 정의된 한정자입니다.

간격 형식

특정 형식의 문자열 리터럴은 간격 값을 나타낼 수 있습니다.

연도 및 월 값을 지정하려면 다음 형식을 사용합니다.

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

여기서

  • sign`은 양수(:code:`+) 또는 음수(-) 기간을 지정하는 필수 기호입니다.

    기본값: +.

  • :samp:`{Y}`는 연도 수입니다. 허용되는 자릿수(전체 자릿수)는 값의 데이터 타입에 따라 다릅니다.

  • :samp:`{MM}`은 월 수를 나타내는 두 자리 숫자로, ``00``~``11``의 범위입니다.

일, 시간, 초, 소수 자리 초의 값을 지정하려면 다음 형식을 사용합니다.

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

여기서

  • sign`은 양수(:code:`+) 또는 음수(-) 기간을 지정하는 필수 기호입니다.

    기본값: +.

  • :samp:`{D}`는 일 수입니다. 허용되는 자릿수(전체 자릿수)는 값의 데이터 타입에 따라 다릅니다.

    다음 유형의 값에 대해 :samp:`{D}`를 생략합니다.

    • INTERVAL HOUR

    • INTERVAL HOUR TO MINUTE

    • INTERVAL HOUR TO SECOND

    • INTERVAL MINUTE

    • INTERVAL MINUTE TO SECOND

    • INTERVAL SECOND

  • :samp:`{HH24}`는 시간을 나타내는 두 자리 숫자로, ``00``~``23``의 범위입니다.

    다음 유형의 값에 대해 :samp:`{HH24}`를 생략합니다.

    • INTERVAL DAY

    • INTERVAL MINUTE

    • INTERVAL MINUTE TO SECOND

    • INTERVAL SECOND

  • :samp:`{MI}`은 분 수를 나타내는 두 자리 숫자로, ``00``~``59``의 범위입니다.

    다음 유형의 값에 대해 :samp:`{MI}`를 생략합니다.

    • INTERVAL DAY TO HOUR

    • INTERVAL DAY

    • INTERVAL HOUR

    • INTERVAL SECOND

  • :samp:`{SS}`는 초 수를 나타내는 두 자리 숫자로, ``00``~``59``의 범위입니다.

    다음 유형의 값에 대해 :samp:`{SS}`를 생략합니다.

    • INTERVAL DAY

    • INTERVAL DAY TO HOUR

    • INTERVAL DAY TO MINUTE

    • INTERVAL HOUR

    • INTERVAL HOUR TO MINUTE

    • INTERVAL MINUTE

  • :samp:`{F}`는 초를 포함하는 데이터 타입의 소수 자리 초 수입니다. 허용되는 자릿수(전체 자릿수)는 값의 데이터 타입에 따라 다릅니다.

다음 사용법 노트는 간격 형식의 문자열 리터럴에 적용됩니다.

  • CAST 또는 TO_CHAR 함수를 사용하여 간격을 텍스트 문자열로 명시적으로 캐스팅하는 경우 문자열 리터럴 표현이 적용됩니다.

  • 필드의 선행 0은 전체 자릿수를 지정합니다.

간격 값의 예제

다음 테이블은 다양한 간격 값을 나타내는 방법을 보여줍니다. 테이블에 표시된 값은 간격 값에 대해 다음 규칙을 따릅니다.

  • 양수 값에서 더하기 기호 :code:`+`는 간격 리터럴 값의 경우 선택 사항이지만 간격 형식 값의 경우 필수입니다.

  • 간격 리터럴 값에서 괄호 안의 값은 허용되는 자릿수인 전체 자릿수를 지정합니다. 예를 들어, ``YEAR(3)``은 연도에 3자리 숫자가 허용됨을 지정합니다.

  • 간격 형식 값에서 기본 필드(선행 필드)는 선행 0을 포함하지 않습니다. 하위 필드는 고정 자릿수를 사용합니다. 예를 들어, ``+1-08``과 같은 YEAR TO MONTH 값에서 연도 필드에는 선행 0이 없으며 월 필드는 2자리 숫자를 사용합니다.

지속 시간

타입

간격 리터럴 값

간격 형식 값

양수 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'

날짜 및 시간 값이 포함된 작업

다음 테이블은 간격 값이 포함된 유효한 산술 연산에 대한 결과의 데이터 타입을 보여줍니다.

첫 번째 피연산자

연산자

두 번째 피연산자

결과 유형

타임스탬프

-

타임스탬프

간격 데이터 타입

날짜 또는 타임스탬프

+

간격

DATE, DATETIME, TIMESTAMP_LTZ, TIMESTAMP_NTZ 또는 TIMESTAMP_TZ

날짜 또는 타임스탬프

-

간격

DATE, DATETIME, TIMESTAMP_LTZ, TIMESTAMP_NTZ 또는 TIMESTAMP_TZ

간격

+

날짜 또는 타임스탬프

DATE, DATETIME, TIMESTAMP_LTZ, TIMESTAMP_NTZ 또는 TIMESTAMP_TZ

숫자

*

간격

간격 데이터 타입

간격

*

숫자

간격 데이터 타입

간격

/

숫자

간격 데이터 타입

간격

+

간격

간격 데이터 타입

간격

-

간격

간격 데이터 타입

두 개의 간격 값이 포함된 작업의 경우 값은 모두 연도-월 간격 값이거나 둘 다 일-시간 간격 값이어야 합니다. 연도-월 간격 값과 일-시간 간격 값을 혼합하는 작업은 지원되지 않습니다. 작업에 두 개의 연도-월 간격 값이 포함된 경우 결과 유형은 연도-월 간격 유형입니다. 작업에 두 개의 일-시간 간격 값이 포함된 경우 결과 유형은 일-시간 간격 유형입니다.

간격 값을 인자로 허용하는 함수

다음 함수는 간격 값을 인자로 허용합니다.

간격 데이터 타입의 예

다음 예에서는 간격 데이터 타입을 사용하는 방법을 보여줍니다.

간격 데이터를 사용하여 산술 수행하기

다음 예에서는 간격 데이터를 사용하여 산술을 수행합니다.

날짜에 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 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 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');

duration_of_experience` 열을 데이터 타입으로 캐스팅하지 않고 테이블을 쿼리하는 경우, 출력은 열 값을 각 행의 총 월 수로 표시합니다.

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 데이터 타입으로 캐스팅하는 경우, 출력은 간격 형식으로 열 값을 표시합니다.

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 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         |
+----------+------------------+
간격 데이터를 테이블에 복사하고 테이블 쿼리하기

다음 단계를 완료하여 간격 데이터가 있는 파일을 스테이징한 후 파일을 테이블에 복사합니다.

  1. 파일 시스템의 파일에서 다음 내용을 복사합니다.

    1,1-2,28 16:15:14.0
    2,-3-2,-54 16:15:14.123
    

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

  2. 스테이지를 생성합니다.

    CREATE STAGE interval_stage;
    
  3. 내부 스테이지 위치에 파일을 스테이징합니다.

    PUT file:///examples/intervals/interval_values.csv @~/interval_stage
      AUTO_COMPRESS=false;
    
  4. 데이터를 위한 테이블을 생성합니다.

    CREATE OR REPLACE TABLE sample_interval_values(
      c1 STRING,
      c2 INTERVAL YEAR(1) TO MONTH,
      c3 INTERVAL DAY(2) TO SECOND(3));
    
  5. 생성한 테이블에 스테이징된 파일을 로드하려면 COPY INTO <테이블> 명령을 사용합니다.

    COPY INTO sample_interval_values FROM @~/interval_stage;
    
  6. 로드된 데이터를 보려면 테이블을 쿼리하고 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 |
    +----+---------------+------------------+
    

간격 데이터 타입에 대한 제한 사항

간격 데이터 타입에는 다음 제한 사항이 적용됩니다.

  • 연도-월 간격 값은 일-시간 간격 값과 결합하거나 비교할 수 없습니다.

  • 간격 상수 및 간격 데이터 타입의 값은 결합하거나 비교할 수 없습니다.

  • 간격 상수는 간격 데이터 타입이 있는 열에 삽입할 수 없습니다.

  • VARIANT 값은 간격 값을 포함할 수 없습니다.

  • 정형 데이터 타입 값은 간격 값을 포함할 수 없습니다.

  • 간격 식은 사용자 정의 함수(UDFs) 또는 :doc:`Snowflake Scripting </developer-guide/snowflake-scripting/index>`에서 사용할 수 없습니다.

  • 다음 유형의 테이블에는 간격 열이 포함될 수 없습니다.

  • 간격 열에 대한 쿼리는 :doc:`/user-guide/search-optimization-service`의 이점을 활용할 수 없습니다.

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는 타임스탬프의 3가지 변형을 지원합니다.

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 감지에서 지원되는 형식 섹션을 참조하십시오.

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

형식 요소

설명

YYYY

4자리 숫자 [1] 연도입니다.

YY

2자리 숫자 [1] 연도로, TWO_DIGIT_CENTURY_START 세션 매개 변수에 의해 제어됩니다. 예를 들어, 1980`으로 설정하면 :code:`7980 값은 각각 2079 및 :code:`1980`으로 구문 분석됩니다.

Y

선행 0이 없는 1자리 숫자 또는 2자리 숫자 [1] 연도로, TWO_DIGIT_CENTURY_START 세션 매개 변수에 의해 제어됩니다. 예를 들어, 매개 변수를 1990`으로 설정하면 :code:`20051991 값이 각각 5 및 :code:`91`로 직렬화됩니다.

MM

2자리 숫자 [1] 월(:code:`01`= 1월 등)입니다.

MO

선행 0이 없는 1자리 숫자 또는 2자리 숫자 [2] 월(1 = 1월 등)입니다.

MON

간략한 월 이름 :sup:`[3]`입니다.

MMMM

전체 월 이름 :sup:`[3]`입니다.

DD

2자리 숫자 [1] 월의 일(01``~``31)입니다.

D

선행 0이 없는 1자리 숫자 또는 2자리 숫자 [2] 날짜(1``~``31)입니다.

DY

간략한 요일입니다.

HH24

2자리 숫자 [1] 시간(00``~``23)입니다. AM/PM 또는 A/:code:`P`로 지정하면 안 됩니다.

HH12

2자리 숫자 [1] 시간(01``~``12)입니다. AM/PM 또는 A/:code:`P`로 지정할 수 있습니다.

H24

선행 0이 없는 1자리 숫자 또는 2자리 숫자 [2] 시간(0``~``23)입니다. AM/PM 또는 A/:code:`P`로 지정하면 안 됩니다.

H12

선행 0이 없는 1자리 숫자 또는 2자리 숫자 [2] 시간(1``~``12)입니다. AM/PM 또는 A/:code:`P`로 지정할 수 있습니다.

AM , PM

오전(AM)/오후(PM)입니다. HH12 및 code:H12`와만 함께 사용합니다(:code:`HH24 또는 :code:`H24`와 함께 사용하지 않음).

P

오전(A)/오후(P)입니다. HH12 및 code:H12`와만 함께 사용합니다(:code:`HH24 또는 :code:`H24`와 함께 사용하지 않음).

HH

:code:`HH24`의 동의어입니다.

H

:code:`H24`의 동의어입니다.

MI

2자리 숫자 [1] 분(00``~``59)입니다.

ME

선행 0이 없는 1자리 숫자 또는 2자리 숫자 [2] 분(0``~``59)입니다.

SS

2자리 숫자 [1] 초(00``~``59)입니다.

S

선행 0이 없는 1자리 숫자 또는 2자리 숫자 [2] 초(0``~``59)입니다.

FF[0-9]

0 (초) ~ 9 (나노초) 전체 자릿수의 소수 자리 초입니다. 예: FF, FF0, FF3, FF9. FF 를 지정하는 것은 FF9 (나노초)와 같습니다.

TZH:TZM , TZHTZM , TZH

2자리 숫자:sup:[1] 타임존 시간 및 분, UTC의 오프셋입니다. 부호에 +/:code:`-`를 접두사로 사용할 수 있습니다.

UUUU

ISO 형식 의 4자리 연도이며, BCE 연도의 경우 음수입니다.

[1] 자릿수는 값을 텍스트로 직렬화할 때 생성되는 출력을 설명합니다. 텍스트를 구문 분석할 때 Snowflake는 지정된 자릿수까지 허용합니다. 예를 들어, 요일 숫자는 1자리 또는 2자리 숫자일 수 있습니다.

:sub:`[2] 자릿수는 값을 텍스트로 직렬화할 때 생성되는 출력을 설명합니다. 구문 분석은 지원되지 않습니다. 구문 분석이 필요한 경우 선행 0을 포함하는 동등한 형식을 사용합니다. 이러한 형식 요소는 BCR번들 2026_03`에서 활성화됩니다.

[3] MON 형식 요소의 경우 값을 텍스트로 직렬화할 때 생성되는 출력은 축약된 월 이름입니다. MMMM 형식 요소의 경우 값을 텍스트로 직렬화할 때 생성되는 출력은 전체 월 이름입니다. 텍스트를 구문 분석할 때 Snowflake는 MON 및 MMMM 모두에 대해 3자리 약어 또는 전체 월 이름을 허용합니다. 예를 들어, 텍스트를 구문 분석할 때 “January” 또는 “Jan”, “February” 또는 “Feb” 등이 허용됩니다.

참고

  • 날짜 전용 형식을 사용하는 경우 연결된 시간은 해당 날짜의 자정으로 간주됩니다.

  • 큰따옴표 사이에 있는 형식이나 위 요소 이외의 형식으로 된 항목은 모두 해석되지 않고 구문 분석/형식 지정됩니다. 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 |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+

날짜 및 시간 상수

상수 (리터럴 이라고도 함)는 고정 데이터 값입니다. 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 '<integer> [ <date_time_part> ] [ , <integer> [ <date_time_part> ] ... ]'

모든 문자열 상수와 마찬가지로, Snowflake에는 간격 상수를 구분하는 작은따옴표가 필요합니다.

참고

간격 상수는 날짜 및 시간 산술을 지원하지만, 간격 저장소를 열 유형으로 지원하지는 않습니다. 간격 값을 열에 저장하려면 :ref:`간격 데이터 타입 <label-datatypes_interval_variations>`을 사용합니다.

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 키워드는 다음의 날짜 및 시간 부분을 인자로 지원합니다(대/소문자 구분 안 함).

날짜 또는 시간 부분

약어/변형

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

간격의 예

특정 날짜에 연도 간격 추가하기:

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;