Преобразование в тип 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>
-
Между датой и часовым поясом допускаются любые пробельные символы.
-
Регистр не учитывается.
-
Допускаются три вида записи:
-
Числовое смещение:
(+|-)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 заполняет соответствующие компоненты результирующего значения даты и времени в соответствии с семантикой каждого поля. Например, значение, соответствующее <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 заполняет соответствующие компоненты результирующего значения даты и времени. Например, год результата задаётся найденным значением <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), используется его фактическое значение до преобразования.
Перенос
Если количество знаков после десятичной точки превышает <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), используется его фактическое значение до преобразования.
Перенос
Если количество знаков после десятичной точки превышает <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 |
TIMESTAMP_NS
Тип TIMESTAMP_NS, как и DATETIME, не учитывает часовой пояс, поэтому при преобразовании сохраняются календарная дата и время без поправки на часовой пояс. Поскольку TIMESTAMP_NS всегда содержит девять знаков дробной части, а DATETIME поддерживает не более шести, дробная часть округляется до точности целевого типа DATETIME. Перенос может перейти на следующую секунду.
Любое допустимое значение TIMESTAMP_NS находится в диапазоне дат DATETIME, поэтому преобразование всегда завершается успешно как в строгом, так и в нестрогом режиме. Для входного значения NULL возвращается NULL.
| Входное значение TIMESTAMP_NS | Целевой тип | Результат DATETIME | Комментарий |
|---|---|---|---|
2024-02-29 12:34:56.123456499 | Datetime(6) | 2024-02-29 12:34:56.123456 | Отбрасываемые цифры приводят к округлению вниз |
2024-02-29 12:34:56.123456500 | Datetime(6) | 2024-02-29 12:34:56.123457 | Отбрасываемые цифры приводят к округлению вверх |
1969-12-31 23:59:59.999999500 | Datetime(6) | 1970-01-01 00:00:00.000000 | Перенос на следующую секунду и дату |
2024-02-29 12:34:56.123456789 | Datetime(3) | 2024-02-29 12:34:56.123 | Округление до миллисекундной точности |