Приведение к типу 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.