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

Преобразование в тип 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>​
  • Между датой и часовым поясом допускаются любые пробельные символы.

  • Регистр не учитывается.

  • Допускаются три вида:

    1. Числовое смещение: (+|-)HH[:MM] или (+|-)HHMM и т. п.

      • <hour-offset>: 0–14; для однозначных значений начальный 0 можно опустить.

      • <minute-offset>: 00, 30 или 45; символ ":" можно опустить.

      • Максимальный диапазон числового смещения: [-14:00, +14:00].

    2. Специальные идентификаторы UTC: Z/UTC/GMT/CST/ZULU. Каждому обозначению соответствует следующее смещение часового пояса:

      • Z: +00:00

      • UTC: +00:00

      • GMT: +00:00

      • CST: +08:00

      • ZULU: +00:00

    3. Полное название часового пояса: все допустимые названия часовых поясов из поддерживаемой 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:002023-07-16 19:20:30.123000Дата с разделителем + "T" + секунды и миллисекунды + числовое смещение. При преобразовании в UTC+8 результат не меняется.
2023-07-16T19+08:002023-07-16 19:00:00.000000Слитный формат времени, минуты и секунды опущены. При преобразовании в UTC+8 результат не меняется.
2023-07-16T1920+08:002023-07-16 19:20:00.000000Слитный формат времени, секунды опущены. При преобразовании в UTC+8 результат не меняется.
70-1-1T00:00:00-00001970-01-01 08:00:00.000000Год из двух цифр + месяц и день из одной/двух цифр + разделитель + слитная запись смещения. При преобразовании в UTC+8 добавляется 8 часов.
19991231T235959.5UTC2000-01-01 07:59:59.500000Слитная дата + "T" + слитная запись часов, минут, секунд + дробная часть + UTC. При преобразовании в UTC+8 добавляется 8 часов.
2024-05-01T00:00Asia/Shanghai2024-05-01 00:00:00.000000Неполное время + название часового пояса. При преобразовании в UTC+8 результат не меняется.
20231005T081530Europe/London2023-10-05 15:15:30.000000Слитная дата + название часового пояса. В период действия летнего времени, GMT+1, преобразование в UTC+8 выполняется добавлением 7 часов.
20230105T081530 Europe/London2023-10-05 16:15:30.000000Слитная дата + название часового пояса. Вне периода действия летнего времени, GMT+0, преобразование в UTC+8 выполняется добавлением 8 часов.
85-12-25T000000gMt1985-12-25 08:00:00.000000Часовой пояс записан буквами разного регистра. При преобразовании в UTC+8 добавляется 8 часов.
2024-05-012024-05-01 00:00:00.000000Только дата
24-5-12024-05-01 00:00:00.000000Год из двух цифр + месяц и день из одной цифры
2024-05-01 0:1:2.3332024-05-01 00:01:02.333000Дата с разделителем + "T" + час, минута и секунда из одной цифры + миллисекунды
2024-05-01 0:1:2.2024-05-01 00:01:02.000000Дата с разделителем + "T" + час, минута и секунда из одной цифры + одна десятичная точка
20240501 012024-05-01 01:00:00.000000Слитная дата + "T" + час из одной цифры, минуты и секунды опущены
20230716 1920Z2023-07-16 19:20:20.000000Слитная дата + пробел + слитная запись часа и минуты + UTC "Z"
2024-05-01T00002024-05-01 00:00:00.000000Дата с разделителем + "T" + слитная запись часа и минуты, секунды опущены
2024-12-31 23:59:59.99999992025-01-01 00:00:00.000000Перенос в год
2025/06/15T00:00:00.999999999999992025-06-15 00:00:01.000000Допускается любое количество знаков после десятичной точки, обычный перенос
2025/06/15T00:00:00.99999872025-06-15 00:00:00.999999Возникает перенос в микросекунды
2025/06/15T00:00:00.999998492025-06-15 00:00:00.999998При округлении учитывается только соседняя цифра, перенос в микросекунды не возникает.
2020-12-12 13:12:12-03:002020-12-13 00:12:12.000000Без переноса
0023-01-01T00:00Z0023-01-01 08:00:00.000000Год из четырёх цифр допустим
69-12-312069-12-31 00:00:00.000000Год из двух цифр 69 → 2069-12-31
70-01-011970-01-01 00:00:00.000000Год из двух цифр 70 → 1970-01-01
2301022023-01-02 00:00:00.000000Слитный формат DATE с короткой записью года
192301011923-01-01 00:00:00.000000Слитный формат DATE с полной записью года
120102030405Ошибка (ошибка формата)Отсутствует разделитель DATE - TIME
20120102030405.123 +082012-01-02 03:05:05.123000Слитный формат даты из 14 цифр + дробная часть + короткая запись смещения часового пояса
120102030405.999Ошибка (ошибка формата)Отсутствует разделитель DATE - TIME
2023-07-16T19.123+08:00Ошибка (ошибка формата)Дата содержит непоследовательные поля (час+миллисекунды с пропуском минут и секунд)
2024/05/012024-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> (как в строгом режиме)​
  • Между датой и часовым поясом допускаются любые пробельные символы.

  • Регистр не учитывается.

  • Допускаются три вида:

    1. Числовое смещение: (+|-)HH[:MM] или (+|-)HHMM

      • <hour-offset>: 0-14; для однозначных значений начальный 0 можно опустить.

      • <minute-offset>: 00, 30 или 45; двоеточие ":" можно опустить.

      • Максимальный диапазон числового смещения: [-14:00, +14:00].

    2. Специальные идентификаторы UTC: Z/UTC/GMT/CST/ZULU. Каждому обозначению соответствует следующее смещение часового пояса:

      • Z: +00:00

      • UTC: +00:00

      • GMT: +00:00

      • CST: +08:00

      • ZULU: +00:00

    3. Полное название часового пояса: любое допустимое название часового пояса из базы данных часовых поясов 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:302000-01-01 02:29:59.000000Поля даты и времени разделены .. Часовой пояс +05:30 (значение минут 30 допустимо); без "T"
2000/01/01T00/00/00-2302000-01-01 10:30:00.000000Разделитель /; часовой пояс без двоеточия, с часом из 1 цифры -230
85 1 1T0 0 0. cst1985-01-01 00:00:00.000000Все поля разделены пробелами; год из двух цифр преобразуется в 1985; после десятичной точки нет цифр; регистр в коротком названии часового пояса не учитывается
2024-02-29T23:59:59.999999 UTC2024-03-01 07:59:59.999999Високосный год допустим; дробная часть высокой точности без переноса; явно заданное название часового пояса
70-01-01T00:00:00+141969-12-31 18:00:00.000000Год из двух цифр 1970; максимальное допустимое смещение +14; часть минут отсутствует
0023-1-1T1:2:3. -00:000023-01-01 09:07:46.000000Год из четырёх цифр 0023; поля времени из одной/двух цифр; после десятичной точки нет цифр; смещение без знака для минут
2025/06/15T00:00:00.0-02025-06-15 08:00:00.000000Разделитель /; 1 цифра после десятичной точки; смещение -0 (эквивалентно -00:00)
2025/06/15T00:00:00.999999999992025-06-15 00:00:01.000000Любое количество знаков после десятичной точки, перенос при приведении к 6 знакам
2024-02-29T23-59-60ZULUNULL (ошибка формата)Секунды вне допустимого диапазона
2024 12 31T121212.123456 America/New_YorkNULL (ошибка формата)Время записано только цифрами, без разделителей
123.123NULL (ошибка формата)Изменение поведения: ранее означало 2012-03-12 03:00:00.000000. Теперь не поддерживается.
12121NULL (ошибка формата)Изменение поведения: ранее означало 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.1232000-01-23 00:00:00.123000Число из 3 цифр + дробная часть
201501020304052015-01-02 03:04:05.000000Число из 14 цифр
20150102030405.1234562015-01-02 03:04:05.123456Число из 14 цифр + дробная часть
20151231235959.999999999992016-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.1232000-01-23 00:00:00.123000Число из 3 цифр + дробная часть
201501020304052015-01-02 03:04:05.000000Число из 14 цифр
20150102030405.1234562015-01-02 03:04:05.123456Число из 14 цифр + дробная часть
20151231235959.999999999992016-01-01 00:00:00.000000Число из 14 цифр, допустимая дробная часть, перенос в год
1000NULLДень в дате 2000-10-00 недопустим
-123.123NULLОтрицательное время не может дать допустимую дату

Преобразование из типов даты и времени​

Типы Date, Time и Timestamptz можно преобразовать в тип Datetime. Поскольку Datetime может иметь разную точность, также поддерживаются преобразования между типами Datetime с разной точностью.

При преобразовании Timestamptz в Datetime используется часовой пояс текущего сеанса.

Date​

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

При преобразовании из Date результат состоит из входной части даты и части времени, полностью заполненной 0. Это преобразование всегда допустимо.

Примеры​

Входное значение DATEЦелевой типРезультат преобразования в Datetime
2012-02-05Datetime(0)2012-02-05 00:00:00
2012-02-05Datetime(6)2012-02-05 00:00:00.000000

Time​

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

При преобразовании из Time результат получается сложением времени 00:00:00 текущей даты и входного значения Time. Поскольку это преобразование допустимо в обозримом будущем (до декабря 9999 года), Doris считает его всегда допустимым.

Примеры​

Предположим, что текущая дата: 2025-04-29. Тогда:

Входное значение TIMEРезультат преобразования в DATETIME(0)
500:00:002025-05-19 20:00:00
23:59:592025-04-29 23:59:59

Datetime​

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

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

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

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

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

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

Примеры​

Предположим, что текущая дата: 2025-04-29. Тогда:

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

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

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

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

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

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

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

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

Примеры​

Предположим, что текущая дата: 2025-04-29. Тогда:

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

Timestamptz​

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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