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

Приведение к типу TIME

Допустимый диапазон значений типа TIME: [-838:59:59.999999, 838:59:59.999999].

Тип TIME имеет параметр типа p, который задаёт число знаков после десятичной точки. Полная запись типа: TIME(p). Например, TIME(6) обозначает тип TIME с микросекундной точностью.

Приведение из String​

Изменение поведения

Начиная с версии 4.0, при разборе значений типа TIME поддерживаются только форматы, описанные в этом документе. Дополнительное преобразование по правилам, допустимым для типа Datetime, больше не выполняется.

Строгий режим​

Определение в BNF​

<time> ::= ("+" | "-")? (<colon-format> | <numeric-format>)

<colon-format> ::= <hour> ":" <minute> (":" <second> (<microsecond>)?)?
<hour> ::= <digit>+
<minute> ::= <digit>{1,2}
<second> ::= <digit>{1,2}

<numeric-format> ::= <digit>+ (<microsecond>)?

<microsecond> ::= "." <digit>*

<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

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

Общая структура​

Поддерживаются два формата: <colon-format> и <numeric-format>.

  • Сначала указывается необязательный знак плюса или минуса, определяющий знак результата.

  • <colon-format> содержит следующие компоненты по порядку:

    • <hour>: 0-23. Не менее одной цифры; значение не должно выходить за диапазон INT.

    • <minute>: 0-59. Одна или две цифры; требуется разделитель : между этим полем и <hour>.

    • <second>: Необязательно. 0-59. Одна или две цифры; требуется разделитель : между этим полем и <minute>. Значение по умолчанию: 0.

    • <microsecond>: Необязательно, начинается с ., за которой следует любое количество цифр. Значение по умолчанию: 0.

  • <numeric-format> содержит следующие компоненты по порядку:

    • Строка последовательных цифр, рассматриваемая как слитная запись полей часов, минут и секунд. Выравнивание выполняется по правому краю: разряд единиц входного значения совмещается с разрядом секунд результата, затем заполнение последовательно продолжается влево. Например, разряд тысяч входного значения совмещается с разрядом десятков минут результата.

    • Необязательная дробная часть, как в поле <microsecond>. Если число знаков превышает p, значение округляется до p знаков после десятичной точки.

Обработка ошибок​
  • Ошибка формата: если значение не соответствует ни одной из приведённых выше ветвей BNF, немедленно сообщается об ошибке.

  • Ошибка диапазона: если результат не является допустимым временем или выходит за диапазон значений типа TIME, сообщается об ошибке.

Примеры​

СтрокаРезультат приведения к TIME(6)Комментарий
100:00:01.000000Разряд единиц совмещён с разрядом секунд
12300:01:23.000000Разряд единиц совмещён с разрядом секунд, заполнение продолжается влево
2005959.12200:59:59.120000Ввод с дробной частью
0.1200:00:00.120000Время 0 в числовом формате + дробная часть
00:00:00.1200:00:00.120000Время 0 в формате с разделителями + дробная часть
123.00:01:23.000000После десятичной точки допускается 0 цифр
123.000:01:23.000000Дробная часть содержит 1 цифру 0
123.12300:01:23.123000Допустимая дробная часть
-1-00:00:01.000000Отрицательное входное значение
12-34:56.1Ошибка (ошибка формата)'-' не является допустимым разделителем
12 : 34 : 56Ошибка (ошибка формата)Недопустимые пробельные символы
76Ошибка (ошибка диапазона)Недопустимое значение секунд: 76
200595912Ошибка (ошибка диапазона)Недопустимое значение часов: 20059
8385959.9999999Ошибка (ошибка диапазона)Перенос приводит к превышению верхней границы

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

Изменение поведения

Начиная с 4.0, значения типа DECIMAL преобразуются в соответствии с их литеральным представлением. Поддерживается разбор поля <microsecond> в микросекунды. Любой формат, выходящий за границы диапазона, считается ошибкой и обрабатывается соответствующим образом.

Нестрогий режим допускает пробельные символы в начале и конце строки, а обработка ошибок отличается от строгого режима.

Определение в BNF​

<time> ::= <whitespace>* ("+" | "-")? (<colon-format> | <numeric-format>) <whitespace>*

<colon-format> ::= <hour> ":" <minute> (":" <second> (<microsecond>)?)?
<hour> ::= <digit>+
<minute> ::= <digit>{1,2}
<second> ::= <digit>{1,2}

<numeric-format> ::= <digit>+ (<microsecond>)?

<microsecond> ::= "." <digit>*

<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<whitespace> ::= " " | "\t" | "\n" | "\r" | "\v" | "\f"

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

Общая структура​

Поддерживаются два формата: <colon-format> и <numeric-format>.

  • Необязательный знак, определяющий знак времени.

  • <colon-format> содержит:

    • <hour>: 0-23. Не менее одной цифры; значение не должно выходить за диапазон INT.

    • <minute>: 0-59. Одна или две цифры, отделяемые символом :.

    • <second>: необязательно. 0-59. Одна или две цифры, отделяемые символом :.

    • <microsecond>: необязательно. Начинается с ., за которой следует любое количество цифр.

  • <numeric-format> содержит:

    • Строка последовательных цифр, рассматриваемая как слитная запись полей часов, минут и секунд. Крайняя правая цифра совмещается с разрядом секунд, остальные заполняются справа налево.

    • Необязательная дробная часть, как в <microsecond>. При избытке цифр значение округляется до заданных p знаков после десятичной точки.

Обработка ошибок​
  • Ошибка формата: если значение не соответствует ни одной из ветвей BNF, возвращается NULL.

  • Ошибка диапазона: если результат не является допустимым временем или выходит за диапазон значений типа TIME, возвращается NULL.

Примеры​

Входная строкаРезультат приведения к TIME(6)Комментарий
100:00:01.000000Крайняя правая цифра совмещается с разрядом секунд
12300:01:23.000000Крайняя правая цифра совмещается с разрядом секунд, заполнение выполняется справа налево
2005959.12200:59:59.120000Ввод с дробной частью
0.1200:00:00.120000Время 0 в числовом формате + дробная часть
00:00:00.1200:00:00.120000Время 0 в формате с двоеточиями + дробная часть
123.00:01:23.000000После десятичной точки допускается 0 цифр
123.000:01:23.000000Дробная часть содержит 1 цифру 0
123.12300:01:23.123000Допустимая дробная часть
-1-00:00:01.000000Отрицательное входное значение
-800:05:05-800:05:05.0000003 цифры в поле часов, отрицательное значение
-991213.56-99:12:13.560000Отрицательное входное значение
80302.999999908:03:03.000000Дробная часть содержит более 6 цифр, возникает перенос
5656.300000000900:56:56.300000Младшие разряды дробной части отброшены
5656.300000700100:56:56.300001Округление до микросекунд
1 NULLНедопустимый формат: пробельные символы не соответствуют BNF
.123NULLОтсутствует поле перед десятичной точкой
:12:34NULLОтсутствует поле часов
12-34:56.1NULL'-' не является допустимым разделителем
12 : 34 : 56NULLНедопустимые пробельные символы
76NULLНедопустимое значение секунд: 76
200595912NULLНедопустимое значение часов: 20059
8385959.9999999NULLПеренос приводит к превышению верхней границы

Приведение из числовых типов​

Все числовые типы можно преобразовать к типу TIME.

Изменение поведения

Начиная с версии 4.0, Doris поддерживает разбор дробной части и преобразование любого числового типа к типу Time.

Строгий режим​

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

Допустимые форматы​

Цифры целой части заполняются от младших разрядов к старшим, от правого края даты к левому. Ниже приведены допустимые форматы и соответствующие результаты заполнения (без микросекундной части):

1-digit number(a)         00:00:0a
2-digit number(ab) 00:00:ab
3-digit number(abc) 00:0a:bc
4-digit number(abcd) 00:ab:cd
5-digit number(abcde) 0a:bc:de
6-digit number(abcdef) ab:cd:ef
7-digit number(abcdefg) abc:de:fg

Цифры дробной части заполняются от старших разрядов к младшим, слева направо, начиная с крайней левой позиции после десятичной точки (разряд сотен миллисекунд). Если дробное число имеет тип с неточным представлением (float, double), непосредственно перед приведением используется его фактическое значение. Если число знаков превышает p, значение округляется до p знаков после десятичной точки.

Если входное значение отрицательное, результатом будет разобранное значение с противоположным знаком.

Обработка ошибок​

Если входное значение невозможно разобрать по указанным правилам и получить допустимое значение TIME, сообщается об ошибке.

Примеры​

ЧислоРезультат приведения к TIME(3)Комментарий
12345612:34:56.000
-123456-12:34:56.000
12300:01:23.000
6.9999900:00:07.000
-0.99-00:00:00.990
8501212850:12:12.000
20001212ОшибкаДлина выходит за допустимые границы
9000000ОшибкаЗначение часов 900 превышает верхнюю границу
67ОшибкаНедопустимое значение секунд: 67

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

Поведение в нестрогом режиме полностью совпадает с поведением в строгом режиме, за исключением обработки ошибок.

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

Допустимые форматы​

Цифры целой части заполняются от младших разрядов к старшим, от правого края времени к левому. Ниже приведены допустимые форматы и соответствующие результаты заполнения (без микросекундной части):

1-digit number(a)         00:00:0a
2-digit number(ab) 00:00:ab
3-digit number(abc) 00:0a:bc
4-digit number(abcd) 00:ab:cd
5-digit number(abcde) 0a:bc:de
6-digit number(abcdef) ab:cd:ef
7-digit number(abcdefg) abc:de:fg

Дробная часть заполняется от старших разрядов к младшим, начиная с крайней левой позиции даты после десятичной точки (разряд сотен миллисекунд). Если дробное число имеет тип с неточным представлением (float, double), перед приведением используется фактическое значение, которое оно представляет.

Если входное значение отрицательное, результатом будет разобранное значение с противоположным знаком.

Обработка ошибок​

Если входное значение невозможно разобрать по указанным правилам и получить допустимое значение TIME, возвращается NULL.

Примеры​

ЧислоРезультат приведения к TIME(3)Комментарий
12345612:34:56.000
-123456-12:34:56.000
12300:01:23.000
6.9999900:00:07.000
-0.99-00:00:00.990
8501212850:12:12.000
20001212NULLДлина выходит за допустимые границы
9000000NULLЗначение часов 900 превышает верхнюю границу
67NULLНедопустимое значение секунд: 67

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

Приведение из Datetime​

Изменение поведения

Начиная с версии 4.0, поддерживается преобразование из типа Datetime в тип Time.

Результатом является временная часть входного значения. Такое преобразование всегда допустимо.

Примеры​

Входное значение DATETIMEРезультат приведения к TIME(4)
2012-02-05 12:12:12.12345612:12:12.1235

Приведение из Time​

Строгий режим​

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

При преобразовании из типа с меньшей точностью в тип с большей точностью новые знаки после десятичной точки заполняются 0. Такое преобразование всегда допустимо.

При преобразовании из типа с большей точностью в тип с меньшей точностью происходит перенос в старший разряд, который может распространяться дальше. При переполнении результат преобразования недопустим.

Обработка ошибок​

При переполнении сообщается об ошибке.

Примеры​

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

Входное значение TIMEИсходный типЦелевой типРезультат TIMEКомментарий
00:00:00.123TIME(3)TIME(6)00:00:00.123000Точность увеличена
00:00:00.123456TIME(6)TIME(3)00:00:00.123Точность уменьшена без переноса
120:00:00.99666TIME(6)TIME(2)120:00:01.00Точность уменьшена с переносом в секунды
838:59:59.999999TIME(6)TIME(5)ОшибкаПереполнение при переносе приводит к недопустимому TIME

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

Поведение в нестрогом режиме полностью совпадает с поведением в строгом режиме, за исключением обработки ошибок.

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

При преобразовании из типа с меньшей точностью в тип с большей точностью новые знаки после десятичной точки заполняются 0. Такое преобразование всегда допустимо.

При преобразовании из типа с большей точностью в тип с меньшей точностью происходит перенос в старший разряд, который может распространяться дальше. При переполнении результат преобразования недопустим.

Обработка ошибок​

При переполнении возвращается NULL.

Примеры​
Входное значение TIMEИсходный типЦелевой типРезультат TIMEКомментарий
00:00:00.123TIME(3)TIME(6)00:00:00.123000Точность увеличена
00:00:00.123456TIME(6)TIME(3)00:00:00.123Точность уменьшена без переноса
120:00:00.99666TIME(6)TIME(2)120:00:01.00Точность уменьшена с переносом в секунды
838:59:59.999999TIME(6)TIME(5)NULLПереполнение при переносе приводит к недопустимому TIME

Приведение из TIMESTAMP_NS​

Результатом является время суток из входного значения. Поскольку TIME(p) поддерживает точность p от 0 до 6, Doris округляет девятизначную дробную часть секунды до целевой точности. Перенос может перейти в следующую секунду, поэтому округление 23:59:59.999999999 может дать 24:00:00.

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

Примеры​

Входное значение TIMESTAMP_NSЦелевой типРезультат приведения к TIMEКомментарий
2024-02-29 12:34:56.123456789TIME(0)12:34:56Округление до целых секунд
2024-02-29 12:34:56.123456789TIME(3)12:34:56.123Округление до миллисекунд
2024-02-29 12:34:56.123456789TIME(6)12:34:56.123457Округление до микросекунд
1969-12-31 23:59:59.999999999TIME(6)24:00:00.000000Перенос в следующую секунду