카테고리:

변환 함수 , 날짜 및 시간 함수

TO_TIMESTAMP / TO_TIMESTAMP_*

입력 식을 다음과 같은 해당 타임스탬프로 변환합니다.

  • TO_TIMESTAMP_LTZ (현지 타임존이 있는 타임스탬프)

  • TO_TIMESTAMP_NTZ (타임존이 없는 타임스탬프)

  • TO_TIMESTAMP_TZ (타임존이 있는 타임스탬프)

참고

TO_TIMESTAMP는 TIMESTAMP_TYPE_MAPPING 세션 매개 변수를 기반으로 다른 타임스탬프 함수 중 하나에 매핑됩니다. 매개 변수 기본값은 TIMESTAMP_NTZ이므로 TO_TIMESTAMP는 기본적으로 TO_TIMESTAMP_NTZ에 매핑됩니다.

참고 항목:

TRY_TO_TIMESTAMP / TRY_TO_TIMESTAMP_* ,

AS_TIMESTAMP_* , IS_TIMESTAMP_* ,

TO_DATE , DATE , TO_TIME , TIME

구문

timestampFunction ( <numeric_expr> [ , <scale> ] )

timestampFunction ( <date_expr> )

timestampFunction ( <timestamp_expr> )

timestampFunction ( <string_expr> [ , <format> ] )

timestampFunction ( '<integer>' )

timestampFunction ( <variant_expr> )
Copy

여기서:

timestampFunction ::=
    TO_TIMESTAMP | TO_TIMESTAMP_LTZ | TO_TIMESTAMP_NTZ | TO_TIMESTAMP_TZ
Copy

인자

필수:

다음 중 하나:

numeric_expr

Unix epoch(1970-01-01 00:00:00 UTC)가 시작된 이후의 초 단위 수(스케일 = 0 또는 없는 경우) 또는 소수 자리 초(예: 밀리초 또는 나노초)입니다. 정수가 아닌 10진수 식이 입력되면 결과의 스케일이 상속됩니다.

date_expr

타임스탬프로 변환할 날짜입니다.

timestamp_expr

다른 타임스탬프로 변환할 타임스탬프입니다(예: TIMESTAMP_LTZ를 TIMESTAMP_NTZ로 변환).

string_expr

타임스탬프를 추출할 문자열입니다(예: 〈2019-01-31 01:02:03.004〉).

'integer'

정수를 포함하는 문자열 로 평가되는 식입니다(예: 〈15000000〉). 문자열의 크기에 따라 초, 밀리초, 마이크로초 또는 나노초로 해석될 수 있습니다. 자세한 내용은 아래의 사용법 노트 를 참조하십시오.

참고

인용된 정수를 입력으로 사용하는 것은 더 이상 가능하지 않습니다.

variant_expr

VARIANT 형식의 식입니다. VARIANT는 다음 중 하나를 포함해야 합니다.

  • 타임스탬프를 추출할 문자열입니다.

  • 타임스탬프입니다.

  • 정수(초 또는 밀리초)입니다.

  • 정수(초 또는 밀리초)를 포함하는 문자열입니다.

TO_TIMESTAMP는 DATE 값을 허용하지만, VARIANT 내부의 DATE는 허용하지 않습니다.

선택 사항:

format

형식 지정자(string_expr 에만 해당)입니다. 자세한 내용은 변환 함수 에서 날짜 및 시간 형식 을 참조하십시오.

기본값은 TIMESTAMP_INPUT_FORMAT 매개 변수의 현재 값입니다(보통 AUTO).

scale

소수 자릿수 지정자(numeric_expr 에만 해당)입니다. 지정된 경우, 제공된 숫자의 스케일을 정의합니다. 예:

  • 초의 경우, 스케일 = 0입니다.

  • 밀리초의 경우, 스케일 = 3입니다.

  • 나노초의 경우, 스케일 = 9입니다.

반환

반환된 값의 데이터 타입은 TIMESTAMP 데이터 타입 중 하나입니다. 기본적으로 데이터 타입은 TIMESTAMP_NTZ 입니다. TIMESTAMP_TYPE_MAPPING 세션 매개 변수를 설정하여 이를 변경할 수 있습니다.

사용법 노트

  • 이 함수 집합은 특히 다음과 같은 타임스탬프 값을 반환합니다.

    • NULL 입력의 경우, 결과는 NULL입니다.

    • string_expr 의 경우: 주어진 문자열이 나타내는 타임스탬프입니다. 문자열에 시간 구성 요소가 없는 경우, 자정이 사용됩니다.

    • date_expr 의 경우: 특정 타임스탬프 특성(NTZ/LTZ/TZ) 의미 체계에 따라, 지정된 날짜의 자정을 나타내는 타임스탬프가 사용됩니다.

    • timestamp_expr 의 경우: 소스 타임스탬프와는 다른 특성을 가질 수 있는 타임스탬프입니다.

    • numeric_expr 의 경우: 사용자가 제공한 초 단위 수(또는 소수 자리 초)를 나타내는 타임스탬프입니다. 결과를 작성하는 데 UTC 시간이 항상 사용됩니다.

    • variant_expr 의 경우:

      • 베리언트에 JSON null 값이 포함된 경우, 결과는 NULL입니다.

      • 베리언트에 결과와 같은 종류의 타임스탬프 값이 포함된 경우, 이 값은 있는 그대로 유지됩니다.

      • 베리언트에 다른 종류의 값을 포함된 경우, 변환은 timestamp_expr 에서와 동일한 방식으로 수행됩니다.

      • 베리언트에 문자열이 포함된 경우 문자열 값에서 변환이 수행됩니다(자동 형식 사용).

      • 베리언트에 숫자가 포함된 경우, numeric_expr 에서와 같은 변환이 수행됩니다.

        참고

        INTEGER 값이 TIMESTAMP_NTZ로 직접 캐스팅되면 정수는 Linux epoch 시작 이후의 초 단위 수로 처리되며, 현지 타임존은 고려되지 않습니다. (자세한 내용은 TO_TIMESTAMP / TO_TIMESTAMP_* 를 참조하십시오.) 그러나 INTEGER 값이 예를 들어, 아래와 같이 VARIANT 값 내부에 저장되는 경우 변환은 간접적이며, 최종 결과가 TIMESTAMP_NTZ이더라도 현지 타임존의 영향을 받습니다.

        select to_timestamp(parse_json(31000000));
        select parse_json(31000000)::timestamp_ntz;
        
        Copy

        현지 타임존과 관계없이 변환하려면 아래와 같이 식의 정수에 명시적 캐스팅을 추가하십시오.

        select to_timestamp(parse_json(31000000)::int);
        select parse_json(31000000)::int::timestamp_ntz;
        
        Copy

        이는 TIMESTAMP_NTZ로 캐스팅하거나 TO_TIMESTAMP_NTZ() 함수를 호출하는지 여부에 적용됩니다. TIMESTAMP_TYPE_MAPPING 매개 변수가 TIMESTAMP_NTZ로 설정된 경우, TO_TIMESTAMP()를 호출할 때도 적용됩니다.

        출력이 있는 예는 이 항목의 끝에 있는 예를 참조하십시오.

    • 변환이 불가능한 경우, 오류가 반환됩니다.

  • 입력 매개 변수의 형식이 정수를 포함하는 문자열인 경우:

    • 문자열이 정수로 변환된 후 정수는 Unix epoch(1970-01-01 00:00:00.000000000 UTC) 시작 후의 초, 밀리초, 마이크로초 또는 나노초 단위 수로 처리됩니다.

      • 정수가 31536000000(1년의 밀리초 단위 수) 미만인 경우, 값은 초 단위 수로 처리됩니다.

      • 값이 31536000000 이상이고 31536000000000 미만인 경우, 값은 밀리초로 처리됩니다.

      • 값이 31536000000000 이상이고 31536000000000000 미만인 경우, 값은 마이크로초로 처리됩니다.

      • 값이 31536000000000000보다 큰 경우, 값은 나노초로 처리됩니다.

      조심

      현재, 음수 값은 항상 초로 처리됩니다. 예를 들어, -31536000000000000000은 1970년 이전의 초 단위 수로 처리되지만, 해당 스케일은 나노초로 사용하도록 의도되었음을 의미합니다.

      이 동작은 나중에 변경될 수 있습니다.

      참고

      사용 중단 경고: Snowflake의 향후 버전은 문자열화된 정수 값을 밀리초, 마이크로초 또는 나노초가 아닌 초로 자동 해석할 수 있습니다. Snowflake는 정수가 초로 해석되도록 의도된 경우에만, 해당 정수를 포함하는 문자열로 TO_DATE, TO_TIME, 또는 TO_TIMESTAMP를 호출할 것을 권장합니다.

    • 둘 이상의 행이 평가되는 경우(예: 입력이 둘 이상의 행을 포함하는 테이블의 열 이름인 경우), 각각의 값을 독립적으로 검사해 값이 초, 밀리초, 마이크로초 또는 나노초를 나타내는지 확인합니다.

다음은 TO_TIMESTAMP_TZ 가 세션의 타임존을 포함하는 타임스탬프를 만들지만, TO_TIMESTAMP_NTZ 의 값에는 타임존이 없음을 보여줍니다.

ALTER SESSION SET TIMEZONE = 'America/Los_Angeles';
+----------------------------------+
| status                           |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
SELECT TO_TIMESTAMP_TZ('2013-04-05 01:02:03');
+----------------------------------------+
| TO_TIMESTAMP_TZ('2013-04-05 01:02:03') |
|----------------------------------------|
| 2013-04-05 01:02:03.000 -0700          |
+----------------------------------------+

SELECT TO_TIMESTAMP_NTZ('2013-04-05 01:02:03');
+-----------------------------------------+
| TO_TIMESTAMP_NTZ('2013-04-05 01:02:03') |
|-----------------------------------------|
| 2013-04-05 01:02:03.000                 |
+-----------------------------------------+
Copy

다음은 모호한 날짜의 구문 분석에 있어, 다양한 형식이 어떻게 영향을 미칠 수 있는지 보여줍니다.

SELECT TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'mm/dd/yyyy hh24:mi:ss');
+-----------------------------------------------------------------+
| TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'MM/DD/YYYY HH24:MI:SS') |
|-----------------------------------------------------------------|
| 2013-04-05 01:02:03.000 -0700                                   |
+-----------------------------------------------------------------+

SELECT TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'dd/mm/yyyy hh24:mi:ss');
+-----------------------------------------------------------------+
| TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'DD/MM/YYYY HH24:MI:SS') |
|-----------------------------------------------------------------|
| 2013-05-04 01:02:03.000 -0700                                   |
+-----------------------------------------------------------------+
Copy

다음은 1970년 1월 1일 자정(UNIX EPOCH 시작)부터의 약 40년을 나타내는 숫자 입력을 사용하는 방법을 보여줍니다.

ALTER SESSION SET TIMESTAMP_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF9 TZH:TZM';
+----------------------------------+
| status                           |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
SELECT TO_TIMESTAMP_NTZ(40 * 365.25 * 86400);
+---------------------------------------+
| TO_TIMESTAMP_NTZ(40 * 365.25 * 86400) |
|---------------------------------------|
| 2010-01-01 00:00:00.000               |
+---------------------------------------+
Copy

다음은 이전 내용과 유사하지만, 스케일 값 3을 제공하여 값을 밀리초로 제공합니다.

ALTER SESSION SET TIMESTAMP_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF9 TZH:TZM';
+----------------------------------+
| status                           |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
SELECT TO_TIMESTAMP_NTZ(40 * 365.25 * 86400 * 1000 + 456, 3);
+-------------------------------------------------------+
| TO_TIMESTAMP_NTZ(40 * 365.25 * 86400 * 1000 + 456, 3) |
|-------------------------------------------------------|
| 2010-01-01 00:00:00.456                               |
+-------------------------------------------------------+
Copy

이 예제에서는 값의 크기를 기준으로 함수가 사용할 단위(초, 밀리초, 마이크로초 또는 나노초)를 결정하는 방법을 보여줍니다.

다양한 범위 내의 정수를 포함하는 문자열이 있는 테이블을 생성하고 로딩합니다.

CREATE TABLE demo1 (
    description VARCHAR,
    value VARCHAR -- yes, string rather than bigint
    );

INSERT INTO demo1 (description, value) VALUES
   ('Seconds',      '31536000'),
   ('Milliseconds', '31536000000'),
   ('Microseconds', '31536000000000'),
   ('Nanoseconds',  '31536000000000000')
   ;
Copy

함수에 문자열을 전달합니다.

SELECT
       description,
       value,
       TO_TIMESTAMP(value),
       TO_DATE(value)
    FROM demo1
    ORDER BY value
    ;
+--------------+-------------------+-------------------------+----------------+
| DESCRIPTION  | VALUE             | TO_TIMESTAMP(VALUE)     | TO_DATE(VALUE) |
|--------------+-------------------+-------------------------+----------------|
| Seconds      | 31536000          | 1971-01-01 00:00:00.000 | 1971-01-01     |
| Milliseconds | 31536000000       | 1971-01-01 00:00:00.000 | 1971-01-01     |
| Microseconds | 31536000000000    | 1971-01-01 00:00:00.000 | 1971-01-01     |
| Nanoseconds  | 31536000000000000 | 1971-01-01 00:00:00.000 | 1971-01-01     |
+--------------+-------------------+-------------------------+----------------+
Copy

다음 예에서는 정수 사용, 그리고 정수가 포함된 베리언트 사용 간의 동작 차이를 보여줍니다.

SELECT 0::TIMESTAMP_NTZ, PARSE_JSON(0)::TIMESTAMP_NTZ, PARSE_JSON(0)::INT::TIMESTAMP_NTZ;
+-------------------------+------------------------------+-----------------------------------+
| 0::TIMESTAMP_NTZ        | PARSE_JSON(0)::TIMESTAMP_NTZ | PARSE_JSON(0)::INT::TIMESTAMP_NTZ |
|-------------------------+------------------------------+-----------------------------------|
| 1970-01-01 00:00:00.000 | 1969-12-31 16:00:00.000      | 1970-01-01 00:00:00.000           |
+-------------------------+------------------------------+-----------------------------------+
Copy
SELECT TO_TIMESTAMP_NTZ(0), TO_TIMESTAMP_NTZ(PARSE_JSON(0)), TO_TIMESTAMP_NTZ(PARSE_JSON(0)::INT);
+-------------------------+---------------------------------+--------------------------------------+
| TO_TIMESTAMP_NTZ(0)     | TO_TIMESTAMP_NTZ(PARSE_JSON(0)) | TO_TIMESTAMP_NTZ(PARSE_JSON(0)::INT) |
|-------------------------+---------------------------------+--------------------------------------|
| 1970-01-01 00:00:00.000 | 1969-12-31 16:00:00.000         | 1970-01-01 00:00:00.000              |
+-------------------------+---------------------------------+--------------------------------------+
Copy