Перейти к содержимому
Последнее обновление

Приведение к типу 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:00Timestamptz(3)Timestamptz(6)2020-12-12 00:00:00.123000+08:00Повышение точности
2020-12-12 00:00:00.123456+08:00Timestamptz(6)Timestamptz(3)2020-12-12 00:00:00.123+08:00Снижение точности без переноса
2020-12-12 00:00:00.996666+08:00Timestamptz(6)Timestamptz(2)2020-12-12 00:00:01.00+08:00Снижение точности с переносом в разряд секунд
9999-12-31 23:59:59.999999+08:00Timestamptz(6)Timestamptz(5)ОшибкаПереполнение при переносе: получается недопустимая дата с годом 10000

Нестрогий режим​

За исключением обработки ошибок, поведение в нестрогом режиме полностью совпадает с поведением в строгом режиме.

Описание правил​

При преобразовании к более высокой точности новые разряды дробной части заполняются 0. Такое преобразование всегда допустимо.

При преобразовании к более низкой точности выполняется округление, при котором перенос может последовательно распространяться на старшие разряды. Если возникает переполнение, результат преобразования недопустим.

Обработка ошибок​

Если возникает переполнение, возвращается NULL.

Примеры​
Входное значение TIMESTAMPTZИсходный типЦелевой типРезультат TIMESTAMPTZКомментарий
2020-12-12 00:00:00.123+08:00Timestamptz(3)Timestamptz(6)2020-12-12 00:00:00.123000+08:00Повышение точности
2020-12-12 00:00:00.123456+08:00Timestamptz(6)Timestamptz(3)2020-12-12 00:00:00.123+08:00Снижение точности без переноса
2020-12-12 00:00:00.99666+08:00Timestamptz(6)Timestamptz(2)2020-12-12 00:00:01.00+08:00Снижение точности с переносом в разряд секунд
9999-12-31 23:59:59.999999+08:00Timestamptz(6)Timestamptz(5)NULLПереполнение при переносе: получается недопустимая дата с годом 10000

Datetime​

Строгий режим​

Описание правил​

При преобразовании к более высокой точности новые разряды дробной части заполняются 0. Такое преобразование всегда допустимо.

При преобразовании к более низкой точности выполняется округление, при котором перенос может последовательно распространяться на старшие разряды. Если возникает переполнение, результат преобразования недопустим.

Обработка ошибок​

Если возникает переполнение, выдаётся ошибка.

Примеры​
Входное значение DATETIMEИсходный типЦелевой типРезультат TIMESTAMPTZКомментарий
2020-12-12 00:00:00.123Datetime(3)Timestamptz(6)2020-12-12 00:00:00.123000+08:00Повышение точности
2020-12-12 00:00:00.123456Datetime(6)Timestamptz(3)2020-12-12 00:00:00.123+08:00Снижение точности без переноса
2020-12-12 00:00:00.99666Datetime(6)Timestamptz(2)2020-12-12 00:00:01.00+08:00Снижение точности с переносом в разряд секунд
9999-12-31 23:59:59.999999Datetime(6)Timestamptz(5)ОшибкаПереполнение при переносе: получается недопустимая дата с годом 10000

Нестрогий режим​

За исключением обработки ошибок, поведение в нестрогом режиме полностью совпадает с поведением в строгом режиме.

Описание правил​

При преобразовании к более высокой точности новые разряды дробной части заполняются 0. Такое преобразование всегда допустимо.

При преобразовании к более низкой точности выполняется округление, при котором перенос может последовательно распространяться на старшие разряды. Если возникает переполнение, результат преобразования недопустим.

Обработка ошибок​

Если возникает переполнение, возвращается NULL.

Примеры​
Входное значение DATETIMEИсходный типЦелевой типРезультат TIMESTAMPTZКомментарий
2020-12-12 00:00:00.123Datetime(3)Timestamptz(6)2020-12-12 00:00:00.123000+08:00Повышение точности
2020-12-12 00:00:00.123456Datetime(6)Timestamptz(3)2020-12-12 00:00:00.123+08:00Снижение точности без переноса
2020-12-12 00:00:00.99666Datetime(6)Timestamptz(2)2020-12-12 00:00:01.00+08:00Снижение точности с переносом в разряд секунд
9999-12-31 23:59:59.999999Datetime(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.123456499Timestamptz(6)2024-02-29 12:34:56.123456+08:00Округление вниз до микросекунд
2024-02-29 12:34:56.123456500Timestamptz(6)2024-02-29 12:34:56.123457+08:00Округление вверх до микросекунд
1969-12-31 23:59:59.999999500Timestamptz(6)1970-01-01 00:00:00.000000+08:00Перенос на следующую секунду

О преобразовании в обратном направлении см. Приведение к TIMESTAMP_NS.