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

Преобразование в тип 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