Преобразование в тип DATETIME
Допустимый диапазон для типа DATETIME:
[0000-01-01 00:00:00.000000, 9999-12-31 23:59:59.999999]
Тип DATETIME включает параметр типа p, который задаёт количество знаков после десятичной точки. Полная форма записи: тип DATETIME(p). Например, DATETIME(6) обозначает тип DATETIME с точностью до микросекунд.
Преобразование из String
Строгий режим
Определение BNF
<datetime> ::= <date> (("T" | " ") <time> <whitespace>* <offset>?)?
| <digit>{14} <fraction>? <whitespace>* <offset>?
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
<date> ::= <year> ("-" | "/") <month1> ("-" | "/") <day1>
| <year> <month2> <day2>
<year> ::= <digit>{2} | <digit>{4} ; 1970 as the boundary
<month1> ::= <digit>{1,2} ; 01–12
<day1> ::= <digit>{1,2} ; 01–28/29/30/31 depending on the month
<month2> ::= <digit>{2} ; 01–12
<day2> ::= <digit>{2} ; 01–28/29/30/31 depending on the month
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
<time> ::= <hour1> (":" <minute1> (":" <second1> <fraction>?)?)?
| <hour2> (<minute2> (<second2> <fraction>?)?)?
<hour1> ::= <digit>{1,2} ; 00–23
<minute1> ::= <digit>{1,2} ; 00–59
<second1> ::= <digit>{1,2} ; 00–59
<hour2> ::= <digit>{2} ; 00–23
<minute2> ::= <digit>{2} ; 00–59
<second2> ::= <digit>{2} ; 00–59
<fraction> ::= "." <digit>*
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
<offset> ::= ( "+" | "-" ) <hour-offset> [ ":"? <minute-offset> ]
| <special-tz>
| <long-tz>
<hour-offset> ::= <digit>{1,2} ; 0–14
<minute-offset> ::= <digit>{2} ; 00/30/45
<special-tz> ::= "CST" | "UTC" | "GMT" | "ZULU" | "Z" ; case-insensitive
<long-tz> ::= ( ^<whitespace> )+ ; e.g. America/New_York
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<area> ::= <alpha>+
<location> ::= (<alpha> | "_")+
<alpha> ::= "A" | … | "Z" | "a" | … | "z"
<whitespace> ::= " " | "\t" | "\n" | "\r" | "\v" | "\f"
Описание правил
Предположим, что целевой тип преобразования: DATETIME(<scale>), где <scale> принимает значения в диапазоне [0, 6].
Общая структура
-
Часть даты обязательна; части времени и часового пояса необязательны.
-
Если указано время, дату и время можно разделять заглавной буквой "T" или пробелом.
-
Если указан часовой пояс, его можно отделять от времени любым количеством пробельных символов ASCII.
-
Допускаются только символы ASCII. Если во входной строке встречаются символы вне ASCII, она не соответствует приведённому выше определению BNF и считается содержащей ошибку формата.
Часть даты <date>
-
Допускаются два формата:
-
С разделителем:
YYYY-MM-DDи т. п. -
Слитный:
YYYYMMDDи т. п.
-
-
<year>: две или четыре цифры.-
Годы из двух цифр (00-99): < 70 → 2000+ значение из двух цифр; ≥ 70 → 1900+ значение из двух цифр.
-
Годы из четырёх цифр используются напрямую.
-
-
В качестве разделителя поддерживается только
-. -
<year>,<month>,<day>могут иметь разную длину в форматах с разделителями; в слитных форматах<year>допускает 2 или 4 цифры, а остальные поля имеют фиксированную длину 2 цифры.
Часть времени <time>
-
Допускаются два формата:
-
С разделителями:
HH[:MM[:SS[.fraction]]]и т. п. -
Слитный:
HH[MM[SS[.fraction]]]и т. п.
-
-
<hour>: 0–23. -
<minute>: 0–59. -
<second>: 0–59. -
<fraction>: любое количество цифр после десятичной точки. Обозначает дробную часть секунды. Старший разряд соответствует 0.1 секунды (сто миллисекунд). -
<hour>,<minute>,<second>допускают 1-2 цифры в форматах с разделителями, а в слитных форматах их длина фиксирована и составляет 2 цифры. -
Можно указывать только последовательные поля начиная слева, опуская остальные части. Например,
<hour>+<minute>допустимо, а<hour>+<fraction>недопустимо.
Формат последовательных цифр <digit>{14}
-
Интерпретируется как год, месяц, день, час, минута, секунда в формате: 4 цифры-2 цифры-2 цифры-2 цифры-2 цифры-2 цифры.
-
Затем дробная часть и часть часового пояса разбираются по обычным правилам.
Часть часового пояса <offset>
-
Между датой и часовым поясом допускаются любые пробельные символы.
-
Регистр не учитывается.
-
Допускаются три вида:
-
Числовое смещение:
(+|-)HH[:MM]или(+|-)HHMMи т. п.-
<hour-offset>: 0–14; для однозначных значений начальный 0 можно опустить. -
<minute-offset>: 00, 30 или 45; символ ":" можно опустить. -
Максимальный диапазон числового смещения:
[-14:00, +14:00].
-
-
Специальные идентификаторы UTC:
Z/UTC/GMT/CST/ZULU. Каждому обозначению соответствует следующее смещение часового пояса:-
Z: +00:00 -
UTC: +00:00 -
GMT: +00:00 -
CST: +08:00 -
ZULU: +00:00
-
-
Полное название часового пояса: все допустимые названия часовых поясов из поддерживаемой IANA базы данных часовых поясов, например
Europe/Paris,Etc/GMT+2и т. п., без учёта регистра.- О доступности названий часовых поясов см. документацию Часовой пояс.
-
Пробельные символы
<whitespace>: любой пробельный символ, включая пробел, табуляцию, перевод строки и т. п.
Логика разбора
Для входных строк, в которых все поля <datetime> допустимы, Doris заполняет поля результирующего значения Datetime в соответствии с их смыслом. Входные значения распределяются по соответствующим частям результата: например, значение, соответствующее <year>, задаёт год результата, а значение, соответствующее <fraction>, задаёт его микросекундную часть. Все части результата, отсутствующие во входных данных, устанавливаются в 0.
В частности, если входная дата имеет значения 0000 год, 00 месяц, 00 день и в BE CONFIG параметр allow_zero_date равен true, это не считается ошибкой значения, а результатом будет 0000 год, 01 месяц, 01 день.
Перенос
-
Если
<fraction>содержит больше<scale>цифр после десятичной точки, значение округляется до<scale>цифр. Если при этом возникает перенос в старший разряд, он выполняется обычным образом и в итоге может затронуть любую часть результата. -
Если входные данные содержат часть
<offset>, может возникнуть перенос.<offset>обычно изменяет значение времени. Если в часах или минутах возникает перенос, он выполняется обычным образом и в итоге может затронуть часть даты в результате. -
Поскольку переносы, вызванные
<offset>и<fraction>, не конфликтуют, они могут происходить одновременно и совместно влиять на результат.
Обработка ошибок
-
Ошибка формата: если входные данные не соответствуют ни одной из приведённых выше ветвей BNF, немедленно выдаётся ошибка.
-
Ошибка значения: если какая-либо часть содержит недопустимое значение (результат не является допустимыми датой и временем по григорианскому календарю), выдаётся ошибка.
Примеры
Предположим, что текущий часовой пояс Doris: UTC+8 (+08:00). О влиянии часовых поясов на разбор типов времени см. документацию Часовой пояс. Результаты приведены для DATETIME(6), то есть типа DATETIME, поддерживающего 6 знаков после десятичной точки.
| Строка | Результат преобразования в DATETIME(6) | Комментарий |
|---|---|---|
2023-07-16T19:20:30.123+08:00 | 2023-07-16 19:20:30.123000 | Дата с разделителем + "T" + секунды и миллисекунды + числовое смещение. При преобразовании в UTC+8 результат не меняется. |
2023-07-16T19+08:00 | 2023-07-16 19:00:00.000000 | Слитный формат времени, минуты и секунды опущены. При преобразовании в UTC+8 результат не меняется. |
2023-07-16T1920+08:00 | 2023-07-16 19:20:00.000000 | Слитный формат времени, секунды опущены. При преобразовании в UTC+8 результат не меняется. |
70-1-1T00:00:00-0000 | 1970-01-01 08:00:00.000000 | Год из двух цифр + месяц и день из одной/двух цифр + разделитель + слитная запись смещения. При преобразовании в UTC+8 добавляется 8 часов. |
19991231T235959.5UTC | 2000-01-01 07:59:59.500000 | Слитная дата + "T" + слитная запись часов, минут, секунд + дробная часть + UTC. При преобразовании в UTC+8 добавляется 8 часов. |
2024-05-01T00:00Asia/Shanghai | 2024-05-01 00:00:00.000000 | Неполное время + название часового пояса. При преобразовании в UTC+8 результат не меняется. |
20231005T081530Europe/London | 2023-10-05 15:15:30.000000 | Слитная дата + название часового пояса. В период действия летнего времени, GMT+1, преобразование в UTC+8 выполняется добавлением 7 часов. |
20230105T081530 Europe/London | 2023-10-05 16:15:30.000000 | Слитная дата + название часового пояса. Вне периода действия летнего времени, GMT+0, преобразование в UTC+8 выполняется добавлением 8 часов. |
85-12-25T000000gMt | 1985-12-25 08:00:00.000000 | Часовой пояс записан буквами разного регистра. При преобразовании в UTC+8 добавляется 8 часов. |
2024-05-01 | 2024-05-01 00:00:00.000000 | Только дата |
24-5-1 | 2024-05-01 00:00:00.000000 | Год из двух цифр + месяц и день из одной цифры |
2024-05-01 0:1:2.333 | 2024-05-01 00:01:02.333000 | Дата с разделителем + "T" + час, минута и секунда из одной цифры + миллисекунды |
2024-05-01 0:1:2. | 2024-05-01 00:01:02.000000 | Дата с разделителем + "T" + час, минута и секунда из одной цифры + одна десятичная точка |
20240501 01 | 2024-05-01 01:00:00.000000 | Слитная дата + "T" + час из одной цифры, минуты и секунды опущены |
20230716 1920Z | 2023-07-16 19:20:20.000000 | Слитная дата + пробел + слитная запись часа и минуты + UTC "Z" |
2024-05-01T0000 | 2024-05-01 00:00:00.000000 | Дата с разделителем + "T" + слитная запись часа и минуты, секунды опущены |
2024-12-31 23:59:59.9999999 | 2025-01-01 00:00:00.000000 | Перенос в год |
2025/06/15T00:00:00.99999999999999 | 2025-06-15 00:00:01.000000 | Допускается любое количество знаков после десятичной точки, обычный перенос |
2025/06/15T00:00:00.9999987 | 2025-06-15 00:00:00.999999 | Возникает перенос в микросекунды |
2025/06/15T00:00:00.99999849 | 2025-06-15 00:00:00.999998 | При округлении учитывается только соседняя цифра, перенос в микросекунды не возникает. |
2020-12-12 13:12:12-03:00 | 2020-12-13 00:12:12.000000 | Без переноса |
0023-01-01T00:00Z | 0023-01-01 08:00:00.000000 | Год из четырёх цифр допустим |
69-12-31 | 2069-12-31 00:00:00.000000 | Год из двух цифр 69 → 2069-12-31 |
70-01-01 | 1970-01-01 00:00:00.000000 | Год из двух цифр 70 → 1970-01-01 |
230102 | 2023-01-02 00:00:00.000000 | Слитный формат DATE с короткой записью года |
19230101 | 1923-01-01 00:00:00.000000 | Слитный формат DATE с полной записью года |
120102030405 | Ошибка (ошибка формата) | Отсутствует разделитель DATE - TIME |
20120102030405.123 +08 | 2012-01-02 03:05:05.123000 | Слитный формат даты из 14 цифр + дробная часть + короткая запись смещения часового пояса |
120102030405.999 | Ошибка (ошибка формата) | Отсутствует разделитель DATE - TIME |
2023-07-16T19.123+08:00 | Ошибка (ошибка формата) | Дата содержит непоследовательные поля (час+миллисекунды с пропуском минут и секунд) |
2024/05/01 | 2024-05-01 | В качестве разделителя даты используется '/' |
24012 | Ошибка (ошибка формата) | Недопустимое количество цифр в дате |
2411 123 | Ошибка (ошибка формата) | Недопустимое количество цифр как в части даты, так и в части времени |
2024-05-01 01:030:02 | Ошибка (ошибка формата) | Недопустимое количество цифр в минутах |
10000-01-01 00:00:00 | Ошибка (ошибка формата) | Недопустимое количество цифр в году |
2024-0131T12:00 | Ошибка (ошибка формата) | Смешанное использование разделителей при слитной записи месяца |
2024-05-01@00:00 | Ошибка (ошибка формата) | Недопустимый разделитель |
20120212051 | Ошибка (ошибка формата) | Неверное количество цифр |
2024-05-01T00:00XYZ | Как правило: ошибка (ошибка формата) | Неизвестное сокращение часового пояса (см. документацию Часовой пояс) |
2024-5-1T24:00 | Ошибка (ошибка значения) | Час 24 вне допустимого диапазона |
2024-02-30 | Ошибка (ошибка значения) | В феврале нет 30 числа |
2024-05-01T12:60 | Ошибка (ошибка значения) | Минута 60 вне допустимого диапазона |
2012-06-30T23:59:60 | Ошибка (ошибка значения) | Секунды координации не допускаются |
2024-05-01T00:00+14:30 | Ошибка (ошибка значения) | Смещение часового пояса выходит за максимальный диапазон |
2024-05-01T00:00+08:25 | Ошибка (ошибка значения) | Значение минут 25 в смещении часового пояса недопустимо |
9999-12-31 23:59:59.9999999 | Ошибка (ошибка значения) | Перенос при сокращении количества знаков после десятичной точки выводит результат за верхнюю границу допустимого диапазона |
Нестрогий режим
Определение BNF
В дополнение к форматам, поддерживаемым в строгом режиме, поддерживаются следующие:
<datetime> ::= <whitespace>* <date> (<delimiter> <time> <whitespace>* <timezone>?)? <whitespace>*
<date> ::= <year> <separator> <month> <separator> <day>
<time> ::= <hour> <separator> <minute> <separator> <second> [<fraction>]
<year> ::= <digit>{4} | <digit>{2}
<month> ::= <digit>{1,2}
<day> ::= <digit>{1,2}
<hour> ::= <digit>{1,2}
<minute> ::= <digit>{1,2}
<second> ::= <digit>{1,2}
<separator> ::= ^(<digit> | <alpha>)
<delimiter> ::= " " | "T" | ":"
<fraction> ::= "." <digit>*
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
<offset> ::= ( "+" | "-" ) <hour-offset> [ ":"? <minute-offset> ]
| <special-tz>
| <long-tz>
<hour-offset> ::= <digit>{1,2} ; 0–14
<minute-offset> ::= <digit>{2} ; 00/30/45
<special-tz> ::= "CST" | "UTC" | "GMT" | "ZULU" | "Z" ; case-insensitive
<long-tz> ::= ( ^<whitespace> )+ ; e.g. America/New_York
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
<whitespace> ::= " " | "\t" | "\n" | "\r" | "\v" | "\f"
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<alpha> ::= "A" | … | "Z" | "a" | … | "z"
Начиная с версии 4.0, часть <year> поддерживает ввод только из 2 или 4 цифр. Поддержка дат или времени без разделителей стала строже: допускается только слитный целочисленный формат из 14 цифр, который поддерживается в строгом режиме и наследуется нестрогим режимом.
При разборе каждого поля больше не допускаются дополнительные начальные нули, из-за которых превышается допустимая длина. Например, 00012 недопустимо для <day> ::= <digit>{1,2}.
При обнаружении неожиданных пробелов разбор завершается неудачей, как и при любых других неожиданных символах, вместо заполнения результата уже разобранными полями.
Описание правил
Предположим, что целевой тип преобразования: DATETIME(<scale>), где <scale> принимает значения в диапазоне [0, 6].
В нестрогом режиме можно разбирать все форматы, поддерживаемые в строгом режиме, а также форматы, соответствующие приведённому выше определению BNF.
Общая структура
-
Часть даты обязательна; части времени и часового пояса необязательны.
-
Строка может содержать любые пробельные символы в начале и конце; дата и время разделяются пробелом или заглавной буквой "T"; каждое входное поле может отделяться любым символом, который не является цифрой или буквой; часовой пояс необязателен.
-
Допускаются только символы ASCII. Если во входной строке встречаются символы вне ASCII, она не соответствует приведённому выше определению BNF и считается содержащей ошибку формата.
Часть даты <date> и часть времени <time>
-
<separator>: любой символ, который не является цифрой или буквой; -
<year>: 2 или 4 цифры.-
Годы из двух цифр (00-99): < 70 → 2000+ значение из двух цифр; ≥ 70 → 1900+ значение из двух цифр.
-
Годы из четырёх цифр используются напрямую.
-
-
<fraction>(необязательно): любое количество цифр после десятичной точки. -
Остальные числовые поля: 1 или 2 цифры.
Часть часового пояса <timezone> (как в строгом режиме)
-
Между датой и часовым поясом допускаются любые пробельные символы.
-
Регистр не учитывается.
-
Допускаются три вида:
-
Числовое смещение:
(+|-)HH[:MM]или(+|-)HHMM-
<hour-offset>: 0-14; для однозначных значений начальный 0 можно опустить. -
<minute-offset>: 00, 30 или 45; двоеточие ":" можно опустить. -
Максимальный диапазон числового смещения:
[-14:00, +14:00].
-
-
Специальные идентификаторы UTC:
Z/UTC/GMT/CST/ZULU. Каждому обозначению соответствует следующее смещение часового пояса:-
Z: +00:00 -
UTC: +00:00 -
GMT: +00:00 -
CST: +08:00 -
ZULU: +00:00
-
-
Полное название часового пояса: любое допустимое название часового пояса из базы данных часовых поясов IANA, например
Europe/Paris,Etc/GMT+2и т. п. (без учёта регистра).- О доступности названий часовых поясов см. документацию Часовой пояс.
-
Пробельные символы
<whitespace>: любой пробельный символ, включая пробел, табуляцию, перевод строки и т. п.
Логика разбора
Для любой входной строки, соответствующей приведённому выше определению BNF, Doris заполняет соответствующие части результирующего значения Datetime. Например, год результата устанавливается в значение, соответствующее <year>, а микросекундная часть результата устанавливается в значение, соответствующее <fraction>. Все части, отсутствующие во входных данных, устанавливаются в 0 в результате.
В частности, если входная дата имеет значение 0000-00-00 и в BE CONFIG параметр allow_zero_date равен true, это не считается ошибкой значения, а результат устанавливается в 0000-01-01.
Перенос
-
Если количество знаков после десятичной точки в
<fraction>превышает<scale>, значение округляется до<scale>знаков. Если при этом возникает перенос в старший разряд, он выполняется обычным образом и может затронуть любую часть результата. -
Если входные данные содержат часть
<offset>, может возникнуть перенос.<offset>обычно изменяет значение времени, и если в часах или минутах возникает перенос, он выполняется обычным образом и может затронуть часть даты в результате. -
Поскольку переносы, вызванные
<offset>и<fraction>, не конфликтуют, они могут происходить одновременно и совместно влиять на результат.
Обработка ошибок
-
Ошибка формата: если входные данные не соответствуют ни одной из приведённых выше ветвей BNF, возвращается NULL.
-
Ошибка значения: если какая-либо часть содержит недопустимое значение (результат не является допустимыми датой и временем по григорианскому календарю), возвращается NULL.
Примеры
Предположим, что текущий часовой пояс Doris: UTC+8 (+08:00). О влиянии часовых поясов на разбор типов времени см. документацию Часовой пояс. Результаты приведены для DATETIME(6), то есть типа DATETIME, поддерживающего 6 знаков после десятичной точки.
| Строка | Результат преобразования в DATETIME(6) | Комментарий |
|---|---|---|
2023-7-4T9-5-3.1Z | 2023-07-04 17:05:03.100000 | Пробелы в начале и конце; поля даты и времени разделены -, между датой и временем стоит T, часовой пояс Z (часовой пояс 0). |
99.12.31 23.59.59+05:30 | 2000-01-01 02:29:59.000000 | Поля даты и времени разделены .. Часовой пояс +05:30 (значение минут 30 допустимо); без "T" |
2000/01/01T00/00/00-230 | 2000-01-01 10:30:00.000000 | Разделитель /; часовой пояс без двоеточия, с часом из 1 цифры -230 |
85 1 1T0 0 0. cst | 1985-01-01 00:00:00.000000 | Все поля разделены пробелами; год из двух цифр преобразуется в 1985; после десятичной точки нет цифр; регистр в коротком названии часового пояса не учитывается |
2024-02-29T23:59:59.999999 UTC | 2024-03-01 07:59:59.999999 | Високосный год допустим; дробная часть высокой точности без переноса; явно заданное название часового пояса |
70-01-01T00:00:00+14 | 1969-12-31 18:00:00.000000 | Год из двух цифр 1970; максимальное допустимое смещение +14; часть минут отсутствует |
0023-1-1T1:2:3. -00:00 | 0023-01-01 09:07:46.000000 | Год из четырёх цифр 0023; поля времени из одной/двух цифр; после десятичной точки нет цифр; смещение без знака для минут |
2025/06/15T00:00:00.0-0 | 2025-06-15 08:00:00.000000 | Разделитель /; 1 цифра после десятичной точки; смещение -0 (эквивалентно -00:00) |
2025/06/15T00:00:00.99999999999 | 2025-06-15 00:00:01.000000 | Любое количество знаков после десятичной точки, перенос при приведении к 6 знакам |
2024-02-29T23-59-60ZULU | NULL (ошибка формата) | Секунды вне допустимого диапазона |
2024 12 31T121212.123456 America/New_York | NULL (ошибка формата) | Время записано только цифрами, без разделителей |
123.123 | NULL (ошибка формата) | Изменение поведения: ранее означало 2012-03-12 03:00:00.000000. Теперь не поддерживается. |
12121 | NULL (ошибка формата) | Изменение поведения: ранее означало 2012-12-12 00:00:00.000000. Теперь не поддерживается. |
Преобразование из числовых типов
Все числовые типы можно преобразовать в тип DATETIME.
Начиная с версии 4.0, типы DECIMAL преобразуются в соответствии с их буквальным числовым представлением. Преобразование типа Boolean в типы времени не поддерживается. Поддерживается разбор дробной части входных значений числовых типов.
Строгий режим
Описание правил
Допустимые форматы
Цифры целой части распределяются от младших разрядов к старшим, от правого края даты к левому. Ниже приведены допустимые форматы и соответствующие результаты заполнения (без микросекундной части):
3-digit number (abc) => 2000 Year 0a Month bc Day
4-digit number (abcd) => 2000 Year ab Month cd Day
5-digit number (abcde) => 200a Year bc Month de Day
6-digit number (abcdef, where ab >= 70) => 19ab Year cd Month ef Day
6-digit number (abcdef, where ab < 70) => 20ab Year cd Month ef Day
8-digit number (abcdefgh) => abcd Year ef Month gh Day
14-digit number (abcdefghijklmn) => abcd Year ef Month gh Day ij Hour kl Minute mn Second
Цифры дробной части распределяются от старших разрядов к младшим, начиная с крайнего левого разряда после десятичной точки (разряда сотен миллисекунд). Если дробное число имеет тип с неточным представлением (float, double), используется фактическое значение, которое оно представляет до Cast.
Перенос
Если количество знаков после десятичной точки превышает <scale>, значение округляется до <scale> знаков. Если при этом возникает перенос в старший разряд, он выполняется обычным образом и может затронуть любую часть результата.
Обработка ошибок
Если входные данные невозможно разобрать в допустимое значение DATETIME по указанным правилам, выдаётся ошибка.
Примеры
Результаты приведены для DATETIME(6), то есть типа DATETIME, поддерживающего 6 знаков после десятичной точки.
| Число | Результат преобразования в DATETIME(6) | Комментарий |
|---|---|---|
123.123 | 2000-01-23 00:00:00.123000 | Число из 3 цифр + дробная часть |
20150102030405 | 2015-01-02 03:04:05.000000 | Число из 14 цифр |
20150102030405.123456 | 2015-01-02 03:04:05.123456 | Число из 14 цифр + дробная часть |
20151231235959.99999999999 | 2016-01-01 00:00:00.000000 | Число из 14 цифр, допустимая дробная часть, перенос в год |
1000 | Ошибка | День в дате 2000-10-00 недопустим |
-123.123 | Ошибка | Отрицательное время не может дать допустимую дату |
Нестрогий режим
За исключением обработки ошибок, поведение в нестрогом режиме полностью соответствует строгому режиму.
Описание правил
Допустимые форматы
Цифры целой части распределяются от младших разрядов к старшим, от правого края даты к левому. Ниже приведены допустимые форматы и соответствующие результаты заполнения (без микросекундной части):
3-digit number (abc) => 2000 Year 0a Month bc Day
4-digit number (abcd) => 2000 Year ab Month cd Day
5-digit number (abcde) => 200a Year bc Month de Day
6-digit number (abcdef, where ab >= 70) => 19ab Year cd Month ef Day
6-digit number (abcdef, where ab < 70) => 20ab Year cd Month ef Day
8-digit number (abcdefgh) => abcd Year ef Month gh Day
14-digit number (abcdefghijklmn) => abcd Year ef Month gh Day ij Hour kl Minute mn Second
Цифры дробной части распределяются от старших разрядов к младшим, начиная с крайнего левого разряда после десятичной точки (разряда сотен миллисекунд). Если дробное число имеет тип с неточным представлением (float, double), используется фактическое значение, которое оно представляет до Cast.
Перенос
Если количество знаков после десятичной точки превышает <scale>, значение округляется до <scale> знаков. Если при этом возникает перенос в старший разряд, он выполняется обычным образом и может затронуть любую часть результата.
Обработка ошибок
Если входные данные невозможно разобрать в допустимое значение DATETIME по указанным правилам, возвращается NULL.
Примеры
Результаты приведены для DATETIME(6), то есть типа DATETIME, поддерживающего 6 знаков после десятичной точки.
| Число | Результат преобразования в DATETIME(6) | Комментарий |
|---|---|---|
123.123 | 2000-01-23 00:00:00.123000 | Число из 3 цифр + дробная часть |
20150102030405 | 2015-01-02 03:04:05.000000 | Число из 14 цифр |
20150102030405.123456 | 2015-01-02 03:04:05.123456 | Число из 14 цифр + дробная часть |
20151231235959.99999999999 | 2016-01-01 00:00:00.000000 | Число из 14 цифр, допустимая дробная часть, перенос в год |
1000 | NULL | День в дате 2000-10-00 недопустим |
-123.123 | NULL | Отрицательное время не может дать допустимую дату |
Преобразование из типов даты и времени
Типы Date, Time и Timestamptz можно преобразовать в тип Datetime. Поскольку Datetime может иметь разную точность, также поддерживаются преобразования между типами Datetime с разной точностью.
При преобразовании Timestamptz в Datetime используется часовой пояс текущего сеанса.
Date
Описание правил
При преобразовании из Date результат состоит из входной части даты и части времени, полностью заполненной 0. Это преобразование всегда допустимо.
Примеры
| Входное значение DATE | Целевой тип | Результат преобразования в Datetime |
|---|---|---|
| 2012-02-05 | Datetime(0) | 2012-02-05 00:00:00 |
| 2012-02-05 | Datetime(6) | 2012-02-05 00:00:00.000000 |
Time
Описание правил
При преобразовании из Time результат получается сложением времени 00:00:00 текущей даты и входного значения Time. Поскольку это преобразование допустимо в обозримом будущем (до декабря 9999 года), Doris считает его всегда допустимым.
Примеры
Предположим, что текущая дата: 2025-04-29. Тогда:
| Входное значение TIME | Результат преобразования в DATETIME(0) |
|---|---|
500:00:00 | 2025-05-19 20:00:00 |
23:59:59 | 2025-04-29 23:59:59 |
Datetime
Строгий режим
Описание правил
При преобразовании от меньшей точности к большей новые разряды после десятичной точки заполняются 0, и такое преобразование всегда допустимо.
При преобразовании от большей точности к меньшей возникает перенос, который может распространяться на старшие разряды. Если происходит переполнение, преобразованное значение недопустимо.
Обработка ошибок
При переполнении выдаётся ошибка.
Примеры
Предположим, что текущая дата: 2025-04-29. Тогда:
| Входное значение DATETIME | Исходный тип | Целевой тип | Результат DATETIME | Комментарий |
|---|---|---|---|---|
2020-12-12 00:00:00.123 | Datetime(3) | Datetime(6) | 2020-12-12 00:00:00.123000 | Повышение точности |
2020-12-12 00:00:00.123456 | Datetime(6) | Datetime(3) | 2020-12-12 00:00:00.123 | Снижение точности без переноса |
2020-12-12 00:00:00.99666 | Datetime(6) | Datetime(2) | 2020-12-12 00:00:01.00 | Снижение точности с переносом в секунды |
9999-12-31 23:59:59.999999 | Datetime(6) | Datetime(5) | Ошибка | Переполнение при переносе приводит к недопустимой дате в году 10000 |
Нестрогий режим
За исключением обработки ошибок, поведение в нестрогом режиме полностью совпадает со строгим режимом.
Описание правил
При преобразовании от меньшей точности к большей новые разряды после десятичной точки заполняются 0, и такое преобразование всегда допустимо.
При преобразовании от большей точности к меньшей возникает перенос, который может распространяться на старшие разряды. Если происходит переполнение, преобразованное значение недопустимо.
Обработка ошибок
При переполнении возвращается NULL.
Примеры
Предположим, что текущая дата: 2025-04-29. Тогда:
| Входное значение DATETIME | Исходный тип | Целевой тип | Результат DATETIME | Комментарий |
|---|---|---|---|---|
2020-12-12 00:00:00.123 | Datetime(3) | Datetime(6) | 2020-12-12 00:00:00.123000 | Повышение точности |
2020-12-12 00:00:00.123456 | Datetime(6) | Datetime(3) | 2020-12-12 00:00:00.123 | Снижение точности без переноса |
2020-12-12 00:00:00.99666 | Datetime(6) | Datetime(2) | 2020-12-12 00:00:01.00 | Снижение точности с переносом в секунды |
9999-12-31 23:59:59.999999 | Datetime(6) | Datetime(5) | NULL | Переполнение при переносе приводит к недопустимой дате в году 10000 |
Timestamptz
Строгий режим
Описание правил
При преобразовании от меньшей точности к большей новые разряды после десятичной точки заполняются 0, и такое преобразование всегда допустимо.
При преобразовании от большей точности к меньшей возникает перенос, который может распространяться на старшие разряды. Если происходит переполнение, преобразованное значение недопустимо.
Обработка ошибок
При переполнении выдаётся ошибка.
Примеры
| Входное значение TIMESTAMPTZ | Исходный тип | Целевой тип | Результат DATETIME | Комментарий |
|---|---|---|---|---|
2020-12-12 00:00:00.123+08:00 | Timestamptz(3) | Datetime(6) | 2020-12-12 00:00:00.123000 | Повышение точности |
2020-12-12 00:00:00.123456+08:00 | Timestamptz(6) | Datetime(3) | 2020-12-12 00:00:00.123 | Снижение точности без переноса |
2020-12-12 00:00:00.99666+08:00 | Timestamptz(6) | Datetime(2) | 2020-12-12 00:00:01.00 | Снижение точности с переносом в секунды |
9999-12-31 23:59:59.999999+08:00 | Timestamptz(6) | Datetime(5) | Ошибка | Переполнение при переносе приводит к недопустимой дате в году 10000 |
Нестрогий режим
За исключением обработки ошибок, поведение в нестрогом режиме полностью совпадает со строгим режимом.
Описание правил
При преобразовании от меньшей точности к большей новые разряды после десятичной точки заполняются 0, и такое преобразование всегда допустимо.
При преобразовании от большей точности к меньшей возникает перенос, который может распространяться на старшие разряды. Если происходит переполнение, преобразованное значение недопустимо.
Обработка ошибок
При переполнении возвращается NULL.
Примеры
| Входное значение TIMESTAMPTZ | Исходный тип | Целевой тип | Результат DATETIME | Комментарий |
|---|---|---|---|---|
2020-12-12 00:00:00.123+08:00 | Timestamptz(3) | Datetime(6) | 2020-12-12 00:00:00.123000 | Повышение точности |
2020-12-12 00:00:00.123456+08:00 | Timestamptz(6) | Datetime(3) | 2020-12-12 00:00:00.123 | Снижение точности без переноса |
2020-12-12 00:00:00.99666+08:00 | Timestamptz(6) | Datetime(2) | 2020-12-12 00:00:01.00 | Снижение точности с переносом в секунды |
9999-12-31 23:59:59.999999+08:00 | Timestamptz(6) | Datetime(5) | NULL | Переполнение при переносе приводит к недопустимой дате в году 10000 |