TIMESTAMPTZ 유형으로 변환
문자열 유형과 숫자 유형을 TIMESTAMPTZ 유형으로 변환하는 규칙은 DATETIME 유형으로 변환하는 규칙과 거의 동일합니다. 차이점은 TIMESTAMPTZ로 변환할 때 변환된 DATETIME 값이 최종적으로 UTC 시간으로 변환된다는 점입니다. 따라서 DATETIME 값 자체는 유효해도 UTC 시간으로 변환된 값은 유효하지 않을 수 있습니다. 예를 들면 다음과 같습니다:
set time_zone="+08:00";
select cast("0000-01-01 00:00:00+08:00" as datetimev2);
+-------------------------------------------------+
| cast("0000-01-01 00:00:00+08:00" as datetimev2) |
+-------------------------------------------------+
| 0000-01-01 00:00:00 |
+-------------------------------------------------+
1 row in set (0.00 sec)
select cast("0000-01-01 00:00:00+08:00" as timestamptz);
+--------------------------------------------------+
| cast("0000-01-01 00:00:00+08:00" as timestamptz) |
+--------------------------------------------------+
| NULL |
+--------------------------------------------------+
1 row in set (0.04 sec)
문자열 0000-01-01 00:00:00+08:00은 유효한 DATETIME 값이지만, UTC 시간으로 변환하면 유효 범위를 벗어나 NULL이 반환됩니다.
자세한 변환 규칙은 DATETIME 유형으로 변환 문서를 참고하세요.
날짜 및 시간 유형에서 변환
Datetime 유형에서 Timestamptz 유형으로의 변환을 지원합니다. 변환 시 DATETIME은 현재 세션의 시간대를 기준으로 UTC 시간으로 변환됩니다. DATETIME 값 자체는 유효해도 UTC 시간으로 변환된 값은 유효하지 않을 수 있습니다.
Timestamptz는 여러 정밀도를 지원하므로, 정밀도가 다른 Timestamptz 유형 간의 변환도 가능합니다.
Timestamptz
엄격 모드
규칙 설명
낮은 정밀도에서 높은 정밀도로 변환할 때는 새로 추가되는 소수 자릿수를 0으로 채우며, 이 변환은 항상 유효합니다.
높은 정밀도에서 낮은 정밀도로 변환할 때는 반올림이 수행되며, 자리올림이 상위 자릿수로 계속 전파될 수 있습니다. 오버플로가 발생하면 변환된 값은 유효하지 않습니다.
오류 처리
오버플로가 발생하면 오류가 보고됩니다.
예제
| 입력 TIMESTAMPTZ | 원본 유형 | 대상 유형 | 결과 TIMESTAMPTZ | 설명 |
|---|---|---|---|---|
2020-12-12 00:00:00.123+08:00 | Timestamptz(3) | Timestamptz(6) | 2020-12-12 00:00:00.123000+08:00 | 정밀도 확장 |
2020-12-12 00:00:00.123456+08:00 | Timestamptz(6) | Timestamptz(3) | 2020-12-12 00:00:00.123+08:00 | 정밀도 축소, 자리올림 없음 |
2020-12-12 00:00:00.996666+08:00 | Timestamptz(6) | Timestamptz(2) | 2020-12-12 00:00:01.00+08:00 | 정밀도 축소, 초 단위로 자리올림 |
9999-12-31 23:59:59.999999+08:00 | Timestamptz(6) | Timestamptz(5) | 오류 | 자리올림으로 인한 오버플로, 유효하지 않은 10000년 날짜 생성 |
비엄격 모드
오류 처리를 제외하면 비엄격 모드의 동작은 엄격 모드와 완전히 동일합니다.
규칙 설명
낮은 정밀도에서 높은 정밀도로 변환할 때는 새로 추가되는 소수 자릿수를 0으로 채우며, 이 변환은 항상 유효합니다.
높은 정밀도에서 낮은 정밀도로 변환할 때는 반올림이 수행되며, 자리올림이 상위 자릿수로 계속 전파될 수 있습니다. 오버플로가 발생하면 변환된 값은 유효하지 않습니다.
오류 처리
오버플로가 발생하면 반환값은 NULL입니다.
예제
| 입력 TIMESTAMPTZ | 원본 유형 | 대상 유형 | 결과 TIMESTAMPTZ | 설명 |
|---|---|---|---|---|
2020-12-12 00:00:00.123+08:00 | Timestamptz(3) | Timestamptz(6) | 2020-12-12 00:00:00.123000+08:00 | 정밀도 확장 |
2020-12-12 00:00:00.123456+08:00 | Timestamptz(6) | Timestamptz(3) | 2020-12-12 00:00:00.123+08:00 | 정밀도 축소, 자리올림 없음 |
2020-12-12 00:00:00.99666+08:00 | Timestamptz(6) | Timestamptz(2) | 2020-12-12 00:00:01.00+08:00 | 정밀도 축소, 초 단위로 자리올림 |
9999-12-31 23:59:59.999999+08:00 | Timestamptz(6) | Timestamptz(5) | NULL | 자리올림으로 인한 오버플로, 유효하지 않은 10000년 날짜 생성 |
Datetime
엄격 모드
규칙 설명
낮은 정밀도에서 높은 정밀도로 변환할 때는 새로 추가되는 소수 자릿수를 0으로 채우며, 이 변환은 항상 유효합니다.
높은 정밀도에서 낮은 정밀도로 변환할 때는 반올림이 수행되며, 자리올림이 상위 자릿수로 계속 전파될 수 있습니다. 오버플로가 발생하면 변환된 값은 유효하지 않습니다.
오류 처리
오버플로가 발생하면 오류가 보고됩니다.
예제
| 입력 DATETIME | 원본 유형 | 대상 유형 | 결과 TIMESTAMPTZ | 설명 |
|---|---|---|---|---|
2020-12-12 00:00:00.123 | Datetime(3) | Timestamptz(6) | 2020-12-12 00:00:00.123000+08:00 | 정밀도 확장 |
2020-12-12 00:00:00.123456 | Datetime(6) | Timestamptz(3) | 2020-12-12 00:00:00.123+08:00 | 정밀도 축소, 자리올림 없음 |
2020-12-12 00:00:00.99666 | Datetime(6) | Timestamptz(2) | 2020-12-12 00:00:01.00+08:00 | 정밀도 축소, 초 단위로 자리올림 |
9999-12-31 23:59:59.999999 | Datetime(6) | Timestamptz(5) | 오류 | 자리올림으로 인한 오버플로, 유효하지 않은 10000년 날짜 생성 |
비엄격 모드
오류 처리를 제외하면 비엄격 모드의 동작은 엄격 모드와 완전히 동일합니다.
규칙 설명
낮은 정밀도에서 높은 정밀도로 변환할 때는 새로 추가되는 소수 자릿수를 0으로 채우며, 이 변환은 항상 유효합니다.
높은 정밀도에서 낮은 정밀도로 변환할 때는 반올림이 수행되며, 자리올림이 상위 자릿수로 계속 전파될 수 있습니다. 오버플로가 발생하면 변환된 값은 유효하지 않습니다.
오류 처리
오버플로가 발생하면 반환값은 NULL입니다.
예제
| 입력 DATETIME | 원본 유형 | 대상 유형 | 결과 TIMESTAMPTZ | 설명 |
|---|---|---|---|---|
2020-12-12 00:00:00.123 | Datetime(3) | Timestamptz(6) | 2020-12-12 00:00:00.123000+08:00 | 정밀도 확장 |
2020-12-12 00:00:00.123456 | Datetime(6) | Timestamptz(3) | 2020-12-12 00:00:00.123+08:00 | 정밀도 축소, 자리올림 없음 |
2020-12-12 00:00:00.99666 | Datetime(6) | Timestamptz(2) | 2020-12-12 00:00:01.00+08:00 | 정밀도 축소, 초 단위로 자리올림 |
9999-12-31 23:59:59.999999 | Datetime(6) | Timestamptz(5) | NULL | 자리올림으로 인한 오버플로, 유효하지 않은 10000년 날짜 생성 |
TIMESTAMP_NS
TIMESTAMP_NS를 TIMESTAMPTZ(p)로 변환할 때 Doris는 시간대 정보가 없는 TIMESTAMP_NS 값을 현재 세션의 시간대로 해석한 뒤, 해당 시점으로 변환하고 나노초 소수부를 대상 정밀도 p(0~6)로 반올림합니다.
모든 유효한 TIMESTAMP_NS 값은 TIMESTAMPTZ의 날짜 범위 안에 있으므로 엄격 모드와 비엄격 모드 모두에서 변환이 항상 성공합니다. NULL을 입력하면 NULL이 반환됩니다.
time_zone = '+08:00'으로 가정합니다:
| 입력 TIMESTAMP_NS | 대상 유형 | 결과 TIMESTAMPTZ | 설명 |
|---|---|---|---|
2024-02-29 12:34:56.123456499 | Timestamptz(6) | 2024-02-29 12:34:56.123456+08:00 | 마이크로초 단위로 내림 |
2024-02-29 12:34:56.123456500 | Timestamptz(6) | 2024-02-29 12:34:56.123457+08:00 | 마이크로초 단위로 올림 |
1969-12-31 23:59:59.999999500 | Timestamptz(6) | 1970-01-01 00:00:00.000000+08:00 | 다음 초로 자리올림 |
반대 방향의 변환은 TIMESTAMP_NS로 변환을 참고하세요.