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

Преобразование в тип TIME

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

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

Из строк​

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

Начиная с версии 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.000000Часы из 3 цифр, отрицательное значение
-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Недопустимые пробелы
76NULL76 секунд недопустимо
200595912NULL20059 часов недопустимо
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), непосредственно используется его фактическое значение перед операцией Cast. Если количество цифр превышает 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), используется фактическое значение, которое оно представляет перед операцией Cast.

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

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

Если входное значение невозможно разобрать по указанным правилам и получить допустимое значение 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 недопустимо