Преобразование к типу 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 |
TIMESTAMP_NS
Описание правил
При преобразовании из TIMESTAMP_NS Doris возвращает дату, отбрасывая время и дробную часть секунды без округления. Любое допустимое значение TIMESTAMP_NS находится в диапазоне DATE, поэтому преобразование всегда выполняется успешно как в строгом, так и в нестрогом режиме. Входное значение NULL возвращает NULL.
Примеры
| Входное значение TIMESTAMP_NS | Результат преобразования к DATE |
|---|---|
1677-09-21 00:12:43.145224192 | 1677-09-21 |
1969-12-31 23:59:59.999999999 | 1969-12-31 |
2024-02-29 12:34:56.123456789 | 2024-02-29 |
2262-04-11 23:47:16.854775807 | 2262-04-11 |