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

Преобразование в тип DATETIME

Допустимый диапазон значений типа DATETIME:

[0000-01-01 00:00:00.000000, 9999-12-31 23:59:59.999999]

Тип DATETIME имеет параметр p, который задаёт количество знаков после десятичной точки. Полная запись типа: DATETIME(p). Например, DATETIME(6) обозначает тип DATETIME с точностью до микросекунд.

Из строкового типа​

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

Определение 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 заполняет соответствующие компоненты результирующего значения даты и времени в соответствии с семантикой каждого поля. Например, значение, соответствующее <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.12300014-значный формат даты без разделителей + дробная часть + короткое смещение часового пояса
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 заполняет соответствующие компоненты результирующего значения даты и времени. Например, год результата задаётся найденным значением <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), используется его фактическое значение до преобразования.

Перенос​

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

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

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

Примеры​

Результаты приведены для DATETIME(6), то есть типа DATETIME, поддерживающего 6 знаков после десятичной точки.

ЧислоРезультат преобразования в DATETIME(6)Комментарий
123.1232000-01-23 00:00:00.1230003-значное число + дробная часть
201501020304052015-01-02 03:04:05.00000014-значное число
20150102030405.1234562015-01-02 03:04:05.12345614-значное число + дробная часть
20151231235959.999999999992016-01-01 00:00:00.00000014-значное число, дробная часть допустима, перенос в разряд года
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), используется его фактическое значение до преобразования.

Перенос​

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

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

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

Примеры​

Результаты приведены для DATETIME(6), то есть типа DATETIME, поддерживающего 6 знаков после десятичной точки.

ЧислоРезультат преобразования в DATETIME(6)Комментарий
123.1232000-01-23 00:00:00.1230003-значное число + дробная часть
201501020304052015-01-02 03:04:05.00000014-значное число
20150102030405.1234562015-01-02 03:04:05.12345614-значное число + дробная часть
20151231235959.999999999992016-01-01 00:00:00.00000014-значное число, дробная часть допустима, перенос в разряд года
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

TIMESTAMP_NS​

Тип TIMESTAMP_NS, как и DATETIME, не учитывает часовой пояс, поэтому при преобразовании сохраняются календарная дата и время без поправки на часовой пояс. Поскольку TIMESTAMP_NS всегда содержит девять знаков дробной части, а DATETIME поддерживает не более шести, дробная часть округляется до точности целевого типа DATETIME. Перенос может перейти на следующую секунду.

Любое допустимое значение TIMESTAMP_NS находится в диапазоне дат DATETIME, поэтому преобразование всегда завершается успешно как в строгом, так и в нестрогом режиме. Для входного значения NULL возвращается NULL.

Входное значение TIMESTAMP_NSЦелевой типРезультат DATETIMEКомментарий
2024-02-29 12:34:56.123456499Datetime(6)2024-02-29 12:34:56.123456Отбрасываемые цифры приводят к округлению вниз
2024-02-29 12:34:56.123456500Datetime(6)2024-02-29 12:34:56.123457Отбрасываемые цифры приводят к округлению вверх
1969-12-31 23:59:59.999999500Datetime(6)1970-01-01 00:00:00.000000Перенос на следующую секунду и дату
2024-02-29 12:34:56.123456789Datetime(3)2024-02-29 12:34:56.123Округление до миллисекундной точности