카테고리:

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

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 입니다.

  • 마이크로초의 경우, 소수 자릿수 = 6 입니다.

  • 나노초의 경우, 소수 자릿수 = 9 입니다.

기본값: 0

반환

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

입력이 NULL이면 결과도 NULL입니다.

사용법 노트

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

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

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

    • timestamp_expr 의 경우: 소스 타임스탬프와 매핑이 다를 수 있는 타임스탬프입니다.

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

    • variant_expr 의 경우:

      • VARIANT에 JSON Null 값이 포함된 경우 출력은 NULL입니다.

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

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

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

      • VARIANT에 숫자가 포함된 경우 numeric_expr 의 변환이 수행됩니다.

        참고

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

        SELECT TO_TIMESTAMP(31000000); SELECT TO_TIMESTAMP(PARSE_JSON(31000000)); SELECT PARSE_JSON(31000000)::TIMESTAMP_NTZ; 
        Copy

        첫 번째 쿼리에서 반환된 타임스탬프는 두 번째, 세 번째 쿼리에서 반환된 시간과 다릅니다.

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

        SELECT TO_TIMESTAMP(31000000); 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를 호출할 때도 적용됩니다.

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

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

  • 타임존이 있는 타임스탬프의 경우 TIMEZONE 매개 변수의 설정이 반환 값에 영향을 줍니다. 반환된 타임스탬프는 세션의 타임존에 있습니다.

  • 출력의 타임스탬프 표시 형식은 함수(TIMESTAMP_OUTPUT_FORMAT, TIMESTAMP_LTZ_OUTPUT_FORMAT, TIMESTAMP_NTZ_OUTPUT_FORMAT 또는 TIMESTAMP_TZ_OUTPUT_FORMAT)에 해당하는 타임스탬프 출력 형식에 따라 결정됩니다.

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

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

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

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

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

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

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

  • TO_TIMESTAMP_NTZ 또는 TRY_TO_TIMESTAMP_NTZ 함수를 사용하여 타임존 정보가 포함된 타임스탬프를 변환하면 타임존 정보가 손실됩니다. 타임스탬프가 타임존 정보가 포함된 타임스탬프로 다시 변환되면(예를 들어, TO_TIMESTAMP_TZ 함수를 사용하여) 타임존 정보를 복구할 수 없습니다.

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

ALTER SESSION SET TIMEZONE = 'America/Los_Angeles'; 
Copy
SELECT TO_TIMESTAMP_TZ('2024-04-05 01:02:03'); 
Copy
+----------------------------------------+ | TO_TIMESTAMP_TZ('2024-04-05 01:02:03') | |----------------------------------------| | 2024-04-05 01:02:03.000 -0700 | +----------------------------------------+ 
SELECT TO_TIMESTAMP_NTZ('2024-04-05 01:02:03'); 
Copy
+-----------------------------------------+ | TO_TIMESTAMP_NTZ('2024-04-05 01:02:03') | |-----------------------------------------| | 2024-04-05 01:02:03.000 | +-----------------------------------------+ 

다음 예제는 다양한 형식이 모호한 날짜의 구문 분석에 어떤 영향을 미칠 수 있는지 보여줍니다. TIMESTAMP_TZ_OUTPUT_FORMAT 이 설정되어 있지 않아 TIMESTAMP_OUTPUT_FORMAT 이 사용되며 기본값(YYYY-MM-DD HH24:MI:SS.FF3 TZHTZM)으로 설정되어 있다고 가정해 보겠습니다.

이 예제에서는 입력 형식이 mm/dd/yyyy hh24:mi:ss (월/일/년)인 경우의 결과를 보여줍니다

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

이 예제에서는 입력 형식이 dd/mm/yyyy hh24:mi:ss (일/월/년)인 경우의 결과를 보여줍니다

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

이 예제는 1970년 1월 1일 자정부터 약 40년(Unix epoch의 시작)을 나타내는 숫자 입력을 사용하는 방법을 보여줍니다. 스케일이 지정되지 않았으므로 기본 스케일 0 (초)가 사용됩니다.

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

이 예제는 앞의 예제와 유사하지만 소수 자릿수 값을 3 으로 지정하여 값을 밀리초로 제공합니다.

SELECT TO_TIMESTAMP_NTZ(40 * 365.25 * 86400 * 1000 + 456, 3); 
Copy
+-------------------------------------------------------+ | TO_TIMESTAMP_NTZ(40 * 365.25 * 86400 * 1000 + 456, 3) | |-------------------------------------------------------| | 2010-01-01 00:00:00.456 | +-------------------------------------------------------+ 

이 예에서는 동일한 숫자 값에 대해 다른 소수 자릿수 값을 지정하면 결과가 어떻게 변경되는지 보여줍니다.

SELECT TO_TIMESTAMP(1000000000, 0) AS "Scale in seconds", TO_TIMESTAMP(1000000000, 3) AS "Scale in milliseconds", TO_TIMESTAMP(1000000000, 6) AS "Scale in microseconds", TO_TIMESTAMP(1000000000, 9) AS "Scale in nanoseconds"; 
Copy
+-------------------------+-------------------------+-------------------------+-------------------------+ | Scale in seconds | Scale in milliseconds | Scale in microseconds | Scale in nanoseconds | |-------------------------+-------------------------+-------------------------+-------------------------| | 2001-09-09 01:46:40.000 | 1970-01-12 13:46:40.000 | 1970-01-01 00:16:40.000 | 1970-01-01 00:00:01.000 | +-------------------------+-------------------------+-------------------------+-------------------------+ 

이 예제에서는 입력이 정수가 포함된 문자열일 때 함수가 값의 크기에 따라 사용할 단위(초, 밀리초, 마이크로초 또는 나노초)를 결정하는 방법을 보여 줍니다.

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

CREATE OR REPLACE TABLE demo1 ( description VARCHAR, value VARCHAR -- 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; 
Copy
+--------------+-------------------+-------------------------+----------------+ | 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 | +--------------+-------------------+-------------------------+----------------+ 

다음 예제에서는 값을 TIMESTAMP_NTZ로 형변환합니다. 예제에서는 정수 사용, 그리고 정수가 포함된 베리언트 사용 간의 동작 차이를 보여줍니다.

SELECT 0::TIMESTAMP_NTZ, PARSE_JSON(0)::TIMESTAMP_NTZ, PARSE_JSON(0)::INT::TIMESTAMP_NTZ; 
Copy
+-------------------------+------------------------------+-----------------------------------+ | 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 | +-------------------------+------------------------------+-----------------------------------+ 

반환된 타임스탬프는 첫 번째 및 세 번째 열의 정수와 정수로 형변환된 변형에 대해서는 일치하지만, 두 번째 열에서 정수로 형변환되지 않은 베리언트에 대해서는 반환된 타임스탬프가 다릅니다. 자세한 내용은 사용법 노트 섹션을 참조하십시오.

TO_TIMESTAMP_NTZ 함수를 호출할 때도 동일한 동작이 적용됩니다.

SELECT TO_TIMESTAMP_NTZ(0), TO_TIMESTAMP_NTZ(PARSE_JSON(0)), TO_TIMESTAMP_NTZ(PARSE_JSON(0)::INT); 
Copy
+-------------------------+---------------------------------+--------------------------------------+ | 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 | +-------------------------+---------------------------------+--------------------------------------+