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에 매핑돼요.

출처: Snowflake SQL Reference - TO_TIMESTAMP / TO_TIMESTAMP_*

본문

구문

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)