TO_TIMESTAMP / TO_TIMESTAMP_*
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) 시작 이후의 초 수(scale = 0이거나 없으면) 또는 초 단위 분수(예: 밀리초 또는 나노초)예요. 비정수 십진 표현식이 입력되면 결과의 scale이 상속돼요.
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에만 해당). 자세한 내용은 Date and time formats in conversion functions를 참고하세요.
기본값은 TIMESTAMP_INPUT_FORMAT 파라미터의 현재 값(기본 AUTO)이에요.
scale
척도 지정자(numeric_expr에만 해당). 지정하면 제공된 숫자의 척도를 정의해요. 예를 들어:
- 초의 경우 scale =
0. - 밀리초의 경우 scale =
3. - 마이크로초의 경우 scale =
6. - 나노초의 경우 scale =
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(한 해의 밀리초 수)보다 작으면 값은 초 수로 처리돼요.
- 값이 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일 자정(Unix epoch 시작)부터 대략 40년을 나타내는 숫자 입력을 사용하는 방법을 보여줘요. scale이 지정되지 않아 기본 scale 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 |
+---------------------------------------+
이 예시는 앞의 예시와 비슷하지만 scale 값을 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 |
+-------------------------------------------------------+
이 예시는 같은 숫자 값에 대해 서로 다른 scale 값을 지정하면 결과가 어떻게 달라지는지 보여줘요:
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로 캐스팅해요. 정수를 사용할 때와 정수를 포함한 variant를 사용할 때의 동작 차이를 보여줘요:
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 |
+-------------------------+------------------------------+-----------------------------------+
첫 번째와 세 번째 컬럼에서 반환된 타임스탬프는 정수와 정수로 캐스팅된 variant에 대해 일치하지만, 두 번째 컬럼의 정수로 캐스팅되지 않은 variant에 대해서는 반환된 타임스탬프가 달라요. 자세한 내용은 사용 시 유의사항을 참고하세요.
이 같은 동작은 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 |
+-------------------------+---------------------------------+--------------------------------------+
더 알아보기 (Learn more)
- TRY_TO_TIMESTAMP / TRY_TO_TIMESTAMP_* — 오류 없이 타임스탬프 변환 시도
- TO_DATE, DATE — 날짜 변환
- TO_TIME, TIME — 시간 변환