- 카테고리:
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
입니다.마이크로초의 경우, 소수 자릿수 =
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;
첫 번째 쿼리에서 반환된 타임스탬프는 두 번째, 세 번째 쿼리에서 반환된 시간과 다릅니다.
현지 타임존과 관계없이 변환하려면 아래와 같이 식의 정수에 명시적 캐스팅을 추가하십시오.
SELECT TO_TIMESTAMP(31000000); 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를 호출할 때도 적용됩니다.
출력이 있는 예는 이 항목의 끝에 있는 예를 참조하십시오.
변환이 불가능한 경우, 오류가 반환됩니다.
타임존이 있는 타임스탬프의 경우 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';
SELECT TO_TIMESTAMP_TZ('2024-04-05 01:02:03');
+----------------------------------------+
| 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');
+-----------------------------------------+
| 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');
+-----------------------------------------------------------------+
| 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');
+-----------------------------------------------------------------+
| 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';
SELECT TO_TIMESTAMP_NTZ(40 * 365.25 * 86400);
+---------------------------------------+
| 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);
+-------------------------------------------------------+
| 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";
+-------------------------+-------------------------+-------------------------+-------------------------+
| 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');
함수에 문자열을 전달합니다.
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 |
+--------------+-------------------+-------------------------+----------------+
다음 예제에서는 값을 TIMESTAMP_NTZ로 형변환합니다. 예제에서는 정수 사용, 그리고 정수가 포함된 베리언트 사용 간의 동작 차이를 보여줍니다.
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 |
+-------------------------+------------------------------+-----------------------------------+
반환된 타임스탬프는 첫 번째 및 세 번째 열의 정수와 정수로 형변환된 변형에 대해서는 일치하지만, 두 번째 열에서 정수로 형변환되지 않은 베리언트에 대해서는 반환된 타임스탬프가 다릅니다. 자세한 내용은 사용법 노트 섹션을 참조하십시오.
TO_TIMESTAMP_NTZ 함수를 호출할 때도 동일한 동작이 적용됩니다.
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 |
+-------------------------+---------------------------------+--------------------------------------+