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

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

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

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

    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 считывает только часть <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:002023-07-16Дата с разделителями + 'T' + секунды и миллисекунды + числовое смещение
2023-07-16T19+08:002023-07-16Формат времени без разделителей, минуты и секунды опущены. При преобразовании в UTC+8 результат не меняется.
2023-07-16T1920+08:002023-07-16Формат времени без разделителей, секунды опущены. При преобразовании в UTC+8 результат не меняется.
70-1-1T00:00:00-00001970-01-01Двузначный год + одно- или двузначные месяц и день + разделитель + смещение без разделителей
19991231T235960.5UTC1999-12-31Дата без разделителей + 'T' + время без разделителей + дробная часть + UTC
2024-02-29 12:00:00 Europe/Paris2024-02-29Допустимая дата високосного года + пробел + полное время + пробел + название часового пояса
2024-05-01T00:00Asia/Shanghai2024-05-01Неполное время + название часового пояса
20231005T081530Europe/London2023-10-05Дата без разделителей + название часового пояса
85-12-25T0000gMt1985-12-25Часовой пояс с буквами разного регистра
2024-05-012024-05-01Только дата
24-5-12024-05-012-значный год + 1-значный месяц + 1-значный день
2024-05-01 0:1:2.3332024-05-01Дата без разделителей + 'T' + однозначные час, минута и секунда + миллисекунды
2024-05-01 0:1:2.2024-05-01Дата без разделителей + 'T' + однозначные час, минута и секунда + десятичная точка без цифр после неё
20240501 012024-05-01Дата без разделителей + ' ' + опущенные минуты и секунды
20230716 1920Z2023-07-16Дата без разделителей + пробел + часы и минуты без разделителя + обозначение UTC 'Z'
20240501T00002024-05-01Дата без разделителей + 'T' + время без разделителей с опущенными секундами
2024-12-31 23:59:59.99999992024-12-31Дата с разделителями + пробел + время с миллисекундами; время игнорируется
2025/06/15T00:00:00.999999999999992025-06-15Допускается любое количество знаков после десятичной точки
2020-12-12 13:12:12-03:002020-12-12Перенос не выполняется
0023-01-01T00:00Z0023-01-01Допустимый четырёхзначный год
69-12-311969-12-31Двузначный год 69 → 1969-12-31
70-01-011970-01-01Двузначный год 70 → 1970-01-01
2301022023-01-02Формат DATE без разделителей с коротким годом
192301011923-01-01Формат DATE без разделителей с длинным годом
120102030405Ошибка (неверный формат)Отсутствует разделитель между DATE и TIME
20120102030405.123 +082012-01-02Дата из 14 цифр без разделителей + дробная часть + краткое смещение часового пояса
120102030405.999Ошибка (неверный формат)Отсутствует разделитель между DATE и TIME
2020-05-05 12:30:602020-05-05Недопустимые секунды, которые не участвуют в интерпретации DATE
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 в смещении часового пояса

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

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

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

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

    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 заполняет соответствующие части результирующего значения 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.1Z2023-07-04Пробельные символы в начале и в конце; дата 2023-7-4 (разделитель -, поддерживаются однозначные месяц и день); время и часовой пояс допустимы
99.12.31 23.59.59+05:301999-12-31. разделяет поля даты и времени; часовой пояс +05:30 (значение минут 30 допустимо); без 'T'
2000/01/01T00/00/00-2302000-01-01Разделитель /; часовой пояс без двоеточия с однозначным часом `-230'
85 1 1T0 0 0. CST1985-01-01Все поля разделены пробелами; двузначный год преобразуется в 1985; цифры после десятичной точки отсутствуют; регистр краткого названия часового пояса не учитывается
2024-02-29T23:59:59.999999 UTC2024-02-29Допустимая дата високосного года; дробная часть высокой точности не вызывает переноса; указано название часового пояса
70-01-01T00:00:00+141970-01-01Двузначный год 1970; максимальное допустимое смещение +14; минуты отсутствуют
0023-1-1T1:2:3. -00:000023-01-01Четырёхзначный год 0023; одно- и двузначные поля времени; цифры после десятичной точки отсутствуют; смещение без знака у минут
2025/06/15T00:00:00.0-02025-06-15Разделитель /; одна цифра после десятичной точки; смещение -0 (эквивалентно -00:00)
2025/06/15T00:00:00.999999999992025-06-15Любое количество знаков после десятичной точки; они игнорируются
2024-02-29T23-59-60ZULUNULL (неверный формат)Значение секунд выходит за допустимый диапазон
2024 12 31T121212.123456 America/New_YorkNULL (неверный формат)Время из одних цифр без разделителей
123.123NULL (неверный формат)Изменение поведения: ранее обозначало 2012-03-12. Теперь не поддерживается.
12121NULL (неверный формат)Изменение поведения: ранее обозначало 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.1232000-01-233-значное число
201501020304052015-01-0214-значное число
20150102030405.1234562015-01-0214-значное число с допустимой дробной частью
20151231235959.999999999992015-12-3114-значное число с допустимой дробной частью
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.1232000-01-233-значное число
201501020304052015-01-0214-значное число
20150102030405.1234562015-01-0214-значное число с допустимой дробной частью
20151231235959.999999999992015-12-3114-значное число с допустимой дробной частью
1000NULLНедопустимый день в 2000-10-00
-123.123NULLОтрицательное время не может образовать допустимую дату

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

Поддерживается преобразование из типов Datetime и Time в тип Date.

Datetime​

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

При преобразовании из Datetime результатом становится дата из входного значения. Это преобразование всегда допустимо.

Примеры​

Входное значение DatetimeРезультат преобразования к Date
2012-02-05 12:35:24.1234562012-02-05

Time​

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

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

Примеры​

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

Входное значение TimeРезультат преобразования к Date
500:00:002025-05-19
23:59:592025-04-29
-128:00:002025-04-23

TIMESTAMP_NS​

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

При преобразовании из TIMESTAMP_NS Doris возвращает дату, отбрасывая время и дробную часть секунды без округления. Любое допустимое значение TIMESTAMP_NS находится в диапазоне DATE, поэтому преобразование всегда выполняется успешно как в строгом, так и в нестрогом режиме. Входное значение NULL возвращает NULL.

Примеры​

Входное значение TIMESTAMP_NSРезультат преобразования к DATE
1677-09-21 00:12:43.1452241921677-09-21
1969-12-31 23:59:59.9999999991969-12-31
2024-02-29 12:34:56.1234567892024-02-29
2262-04-11 23:47:16.8547758072262-04-11