Преобразование в тип DATE
Допустимый диапазон для типа DATE: [0000-01-01, 9999-12-31]
Из строк
Строгий режим
Определение 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"
Описание правил
Общая структура
-
Часть даты обязательна; части времени и часового пояса необязательны.
-
Если указано время, дату и время можно разделять заглавной буквой "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 считывает только часть <date> и использует её результат как целевое значение после преобразования. Поля входных данных заполняют соответствующие части результата: например, значение, соответствующее <year>, задаёт год результата, значение, соответствующее <month>, задаёт месяц результата, а значение, соответствующее <day>, задаёт день результата.
В частности, если результат разбора входной даты содержит год 0000, месяц 00 и день 00, а параметр BE CONFIG allow_zero_date имеет значение true, это не считается ошибкой диапазона, и результат содержит год 0000, месяц 01 и день 01.
Перенос разрядов
Перенос разрядов не происходит.
Обработка ошибок
-
Ошибка формата: если входные данные не соответствуют ни одной из приведённых выше ветвей BNF, немедленно выдаётся ошибка.
-
Ошибка диапазона: если часть
<date>некорректна (то есть не задаёт допустимую дату григорианского календаря), выдаётся ошибка.
Примеры
Предположим, что текущий часовой пояс Doris установлен в UTC+8 (+08:00). О влиянии часовых поясов на разбор типов времени см. документацию Часовой пояс.
| Строка | Результат преобразования в DATE | Комментарий |
|---|---|---|
2023-07-16T19:20:30.123+08:00 | 2023-07-16 | Дата с разделителями + 'T' + секунды и миллисекунды + числовое смещение |
2023-07-16T19+08:00 | 2023-07-16 | Слитный формат времени, минуты и секунды опущены. Результат не меняется при преобразовании в UTC+8. |
2023-07-16T1920+08:00 | 2023-07-16 | Слитный формат времени, секунды опущены. Результат не меняется при преобразовании в UTC+8. |
70-1-1T00:00:00-0000 | 1970-01-01 | Двузначный год + одно- или двузначные месяц и день + разделитель + слитная запись смещения |
19991231T235960.5UTC | 1999-12-31 | Слитная запись даты + 'T' + слитная запись времени + дробная часть + UTC |
2024-02-29 12:00:00 Europe/Paris | 2024-02-29 | Допустимая дата високосного года + пробел + полная запись времени + пробел + имя часового пояса |
2024-05-01T00:00Asia/Shanghai | 2024-05-01 | Неполная запись времени + имя часового пояса |
20231005T081530Europe/London | 2023-10-05 | Слитная запись даты + имя часового пояса |
85-12-25T0000gMt | 1985-12-25 | Часовой пояс со смешанным регистром букв |
2024-05-01 | 2024-05-01 | Только дата |
24-5-1 | 2024-05-01 | 2-значный год + 1-значный месяц + 1-значный день |
2024-05-01 0:1:2.333 | 2024-05-01 | Слитная запись даты + 'T' + однозначные час, минута и секунда + миллисекунды |
2024-05-01 0:1:2. | 2024-05-01 | Слитная запись даты + 'T' + однозначные час, минута и секунда + десятичная точка без дробной части |
20240501 01 | 2024-05-01 | Слитная запись даты + ' ' + опущенные минуты и секунды |
20230716 1920Z | 2023-07-16 | Слитная запись даты + пробел + слитная запись часа и минуты + UTC 'Z' |
20240501T0000 | 2024-05-01 | Слитная запись даты + 'T' + слитная запись времени без секунд |
2024-12-31 23:59:59.9999999 | 2024-12-31 | Дата с разделителями + пробел + время с миллисекундами; часть времени игнорируется |
2025/06/15T00:00:00.99999999999999 | 2025-06-15 | Допускается любое количество знаков после десятичной точки |
2020-12-12 13:12:12-03:00 | 2020-12-12 | Перенос разрядов не происходит |
0023-01-01T00:00Z | 0023-01-01 | Допустимый четырёхзначный год |
69-12-31 | 1969-12-31 | Двузначный год 69 → 1969-12-31 |
70-01-01 | 1970-01-01 | Двузначный год 70 → 1970-01-01 |
230102 | 2023-01-02 | Слитный формат DATE с короткой записью года |
19230101 | 1923-01-01 | Слитный формат DATE с длинной записью года |
120102030405 | Ошибка (ошибка формата) | Отсутствует разделитель DATE - TIME |
20120102030405.123 +08 | 2012-01-02 | 14-значная слитная запись даты + дробная часть + короткая запись смещения часового пояса |
120102030405.999 | Ошибка (ошибка формата) | Отсутствует разделитель DATE - TIME |
2020-05-05 12:30:60 | 2020-05-05 | Некорректные секунды, но они не участвуют в интерпретации DATE |
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 в смещении часового пояса |
Нестрогий режим
Определение 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> ::= any symbol except digits or letters
<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} недопустимо.
При обнаружении неожиданного пробельного символа разбор завершается неудачей, как и при любом другом неожиданном символе, вместо заполнения результата уже разобранными полями.
Описание правил
В нестрогом режиме можно разобрать все форматы, поддерживаемые в строгом режиме, а также форматы, соответствующие приведённому выше определению BNF.
Общая структура
-
Часть даты обязательна; части времени и часового пояса необязательны.
-
В начале и конце строки могут присутствовать любые пробельные символы ASCII; дата и время разделяются пробелом или заглавной буквой '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 заполняет соответствующие части результата типа Date. Например, год результата задаётся значением, соответствующим <year>, а микросекунды результата задаются значением, соответствующим <fraction>. Все части, отсутствующие во входных данных, получают в результате значение 0.
Перенос разрядов
Начиная с версии 4.0, при разборе типа DATE части, отличные от <date>, не вызывают переноса разрядов и не оказывают числового влияния на результат.
Перенос разрядов не происходит.
Обработка ошибок
-
Ошибка формата: если входные данные не соответствуют ни одной из приведённых выше ветвей BNF, возвращается NULL.
-
Ошибка диапазона: если часть
<date>некорректна (то есть не задаёт допустимую дату григорианского календаря), возвращается NULL.
Начиная с версии 4.0, при разборе типа DATE ошибки диапазона в частях, отличных от <date>, не влияют на результат.
Примеры
Предположим, что текущий часовой пояс Doris установлен в UTC+8 (+08:00). О влиянии часовых поясов на разбор типов времени см. документацию Часовой пояс.
| Строка | Результат преобразования в DATE | Комментарий |
|---|---|---|
2023-7-4T9-5-3.1Z | 2023-07-04 | Пробельные символы в начале и конце; дата 2023-7-4 (разделитель -, поддерживаются однозначные месяц и день); время и часовой пояс корректны |
99.12.31 23.59.59+05:30 | 1999-12-31 | . разделяет поля даты и времени; часовой пояс +05:30 (минута 30 допустима); без 'T' |
2000/01/01T00/00/00-230 | 2000-01-01 | Разделитель /; часовой пояс без двоеточия и с однозначным часом `-230' |
85 1 1T0 0 0. CST | 1985-01-01 | Все поля разделены пробелами; двузначный год преобразуется в 1985; после десятичной точки нет цифр; короткое имя часового пояса не зависит от регистра |
2024-02-29T23:59:59.999999 UTC | 2024-02-29 | Допустимая дата високосного года; дробная часть высокой точности не вызывает переноса разрядов; конкретное имя часового пояса |
70-01-01T00:00:00+14 | 1970-01-01 | Двузначный год 1970; максимальное допустимое смещение +14; часть минут отсутствует |
0023-1-1T1:2:3. -00:00 | 0023-01-01 | Четырёхзначный год 0023; смешанные одно- и двузначные поля времени; после десятичной точки нет цифр; смещение без знака у минут |
2025/06/15T00:00:00.0-0 | 2025-06-15 | Разделитель /; одна цифра после десятичной точки; смещение -0 (эквивалентно -00:00) |
2025/06/15T00:00:00.99999999999 | 2025-06-15 | Любое количество знаков после десятичной точки, они игнорируются |
2024-02-29T23-59-60ZULU | NULL (ошибка формата) | Секунда вне допустимого диапазона |
2024 12 31T121212.123456 America/New_York | NULL (ошибка формата) | Время записано только цифрами, без разделителей |
123.123 | NULL (ошибка формата) | Изменение поведения: ранее означало 2012-03-12. Теперь не поддерживается. |
12121 | NULL (ошибка формата) | Изменение поведения: ранее означало 2012-12-12. Теперь не поддерживается. |
Из числовых типов
Поддерживается преобразование всех числовых типов в тип DATE.
Начиная с версии 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
Обработка ошибок
Если после разбора по указанным правилам входные данные не позволяют получить допустимое значение DATE, выдаётся ошибка.
Примеры
| Число | Результат преобразования в DATE | Комментарий |
|---|---|---|
123.123 | 2000-01-23 | 3-значное число |
20150102030405 | 2015-01-02 | 14-значное число |
20150102030405.123456 | 2015-01-02 | 14-значное число, допустимая дробная часть |
20151231235959.99999999999 | 2015-12-31 | 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
Обработка ошибок
Если после разбора по указанным правилам входные данные не позволяют получить допустимое значение DATE, возвращается NULL.
Примеры
| Число | Результат преобразования в DATE | Комментарий |
|---|---|---|
123.123 | 2000-01-23 | 3-значное число |
20150102030405 | 2015-01-02 | 14-значное число |
20150102030405.123456 | 2015-01-02 | 14-значное число, допустимая дробная часть |
20151231235959.99999999999 | 2015-12-31 | 14-значное число, допустимая дробная часть |
1000 | NULL | Недопустимый день в дате 2000-10-00 |
-123.123 | NULL | Отрицательное время не позволяет получить допустимую дату |
Из типов даты и времени
Поддерживается преобразование типов Datetime и Time в тип Date.
Datetime
Описание правил
При преобразовании из Datetime результатом является часть даты входного значения. Это преобразование всегда допустимо.
Примеры
| Входное значение Datetime | Результат преобразования в Date |
|---|---|
2012-02-05 12:35:24.123456 | 2012-02-05 |
Time
Описание правил
При преобразовании из Time результатом является сумма текущей даты и входного значения Time. Поскольку это преобразование допустимо в обозримом будущем (до декабря 9999 года), Doris считает его всегда допустимым.
Примеры
Предположим, что текущая дата 2025-04-29, тогда:
| Входное значение Time | Результат преобразования в Date |
|---|---|
500:00:00 | 2025-05-19 |
23:59:59 | 2025-04-29 |
-128:00:00 | 2025-04-23 |