- 카테고리:
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에 매핑됩니다.
구문¶
timestampFunction ( <numeric_expr> [ , <scale> ] )
timestampFunction ( <date_expr> )
timestampFunction ( <timestamp_expr> )
timestampFunction ( <string_expr> [ , <format> ] )
timestampFunction ( '<integer>' )
timestampFunction ( <variant_expr> )
여기서:
timestampFunction ::= TO_TIMESTAMP | TO_TIMESTAMP_LTZ | TO_TIMESTAMP_NTZ | TO_TIMESTAMP_TZ
인자¶
필수:
다음 중 하나:
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;
현지 타임존과 관계없이 변환하려면 아래와 같이 식의 정수에 명시적 캐스팅을 추가하십시오.
select to_timestamp(parse_json(31000000)::int); select parse_json(31000000)::int::timestamp_ntz;
이는 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보다 큰 경우, 값은 나노초로 처리됩니다.
참고
사용 중단 경고: 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 |
+-----------------------------------------+
다음은 모호한 날짜의 구문 분석에 있어, 다양한 형식이 어떻게 영향을 미칠 수 있는지 보여줍니다.
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 |
+-----------------------------------------------------------------+
다음은 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 |
+---------------------------------------+
다음은 이전 내용과 유사하지만, 스케일 값 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 |
+-------------------------------------------------------+
이 예제에서는 값의 크기를 기준으로 함수가 사용할 단위(초, 밀리초, 마이크로초 또는 나노초)를 결정하는 방법을 보여줍니다.
다양한 범위 내의 정수를 포함하는 문자열이 있는 테이블을 생성하고 로딩합니다.
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') ;함수에 문자열을 전달합니다.
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 | +--------------+-------------------+-------------------------+----------------+
다음 예에서는 정수 사용, 그리고 정수가 포함된 베리언트 사용 간의 동작 차이를 보여줍니다.
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 | +-------------------------+------------------------------+-----------------------------------+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 | +-------------------------+---------------------------------+--------------------------------------+