카테고리:

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

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              |
+-------------------------+---------------------------------+--------------------------------------+