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

Преобразование в тип 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-0214-значная слитная запись даты + дробная часть + короткая запись смещения часового пояса
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