Преобразование в тип 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) | Комментарий |
|---|---|---|
1 | 00:00:01.000000 | Разряд единиц соответствует разряду секунд |
123 | 00:01:23.000000 | Разряд единиц соответствует разряду секунд, остальные разряды заполняются влево |
2005959.12 | 200:59:59.120000 | Входное значение с дробной частью |
0.12 | 00:00:00.120000 | Время 0 в числовом формате + дробная часть |
00:00:00.12 | 00:00:00.120000 | Время 0 в формате с разделителями + дробная часть |
123. | 00:01:23.000000 | Дробная часть допускает 0 цифр |
123.0 | 00:01:23.000000 | Дробная часть: 1 цифра 0 |
123.123 | 00: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) | Комментарий |
|---|---|---|
1 | 00:00:01.000000 | Крайняя правая цифра соответствует разряду секунд |
123 | 00:01:23.000000 | Крайняя правая цифра соответствует разряду секунд, остальные разряды заполняются справа налево |
2005959.12 | 200:59:59.120000 | Входное значение с дробной частью |
0.12 | 00:00:00.120000 | Время 0 в числовом формате + дробная часть |
00:00:00.12 | 00:00:00.120000 | Время 0 в формате с двоеточиями + дробная часть |
123. | 00:01:23.000000 | Дробная часть допускает 0 цифр |
123.0 | 00:01:23.000000 | Дробная часть: 1 цифра 0 |
123.123 | 00:01:23.123000 | Допустимая дробная часть |
-1 | -00:00:01.000000 | Отрицательное входное значение |
-800:05:05 | -800:05:05.000000 | Часы из 3 цифр, отрицательное значение |
-991213.56 | -99:12:13.560000 | Отрицательное входное значение |
80302.9999999 | 08:03:03.000000 | Дробная часть содержит более 6 цифр, происходит перенос в старший разряд |
5656.3000000009 | 00:56:56.300000 | Младшие разряды дробной части отбрасываются |
5656.3000007001 | 00:56:56.300001 | Округление до микросекунд |
1 | NULL | Недопустимый формат: BNF не допускает пробельных символов |
.123 | NULL | Перед десятичной точкой отсутствует поле |
:12:34 | NULL | Отсутствуют часы |
12-34:56.1 | NULL | '-' не является допустимым разделителем |
12 : 34 : 56 | NULL | Недопустимые пробелы |
76 | NULL | 76 секунд недопустимо |
200595912 | NULL | 20059 часов недопустимо |
8385959.9999999 | NULL | Перенос в старший разряд приводит к превышению верхней границы |
Из числовых типов
Все числовые типы можно преобразовать в тип 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) | Комментарий |
|---|---|---|
123456 | 12:34:56.000 | |
-123456 | -12:34:56.000 | |
123 | 00:01:23.000 | |
6.99999 | 00:00:07.000 | |
-0.99 | -00:00:00.990 | |
8501212 | 850: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) | Комментарий |
|---|---|---|
123456 | 12:34:56.000 | |
-123456 | -12:34:56.000 | |
123 | 00:01:23.000 | |
6.99999 | 00:00:07.000 | |
-0.99 | -00:00:00.990 | |
8501212 | 850:12:12.000 | |
20001212 | NULL | Длина выходит за допустимые пределы |
9000000 | NULL | Часы 900 превышают верхнюю границу |
67 | NULL | Секунды 67 недопустимы |
Из типов даты и времени
Из Datetime
Начиная с версии 4.0 поддерживается преобразование из типа Datetime в тип Time.
Результатом является часть входного значения, содержащая время. Такое преобразование всегда допустимо.
Примеры
| Входное значение DATETIME | Результат преобразования в TIME(4) |
|---|---|
2012-02-05 12:12:12.123456 | 12:12:12.1235 |
Из Time
Строгий режим
Описание правил
При преобразовании из меньшей точности в большую новые разряды дробной части заполняются цифрой 0. Такое преобразование всегда допустимо.
При преобразовании из большей точности в меньшую происходит перенос в старший разряд, который может распространяться дальше. Если возникает переполнение, преобразованное значение недопустимо.
Обработка ошибок
При переполнении выдаётся ошибка.
Примеры
Предположим, что текущая дата 2025-04-29. Тогда:
| Входное значение TIME | Исходный тип | Целевой тип | Результат TIME | Комментарий |
|---|---|---|---|---|
00:00:00.123 | TIME(3) | TIME(6) | 00:00:00.123000 | Повышение точности |
00:00:00.123456 | TIME(6) | TIME(3) | 00:00:00.123 | Снижение точности без переноса |
120:00:00.99666 | TIME(6) | TIME(2) | 120:00:01.00 | Снижение точности с переносом в секунды |
838:59:59.999999 | TIME(6) | TIME(5) | Ошибка | Перенос вызывает переполнение, полученное значение TIME недопустимо |
Нестрогий режим
За исключением обработки ошибок, поведение в нестрогом режиме полностью совпадает с поведением в строгом режиме.
Описание правил
При преобразовании из меньшей точности в большую новые разряды дробной части заполняются цифрой 0. Такое преобразование всегда допустимо.
При преобразовании из большей точности в меньшую происходит перенос в старший разряд, который может распространяться дальше. Если возникает переполнение, преобразованное значение недопустимо.
Обработка ошибок
При переполнении возвращается NULL.
Примеры
| Входное значение TIME | Исходный тип | Целевой тип | Результат TIME | Комментарий |
|---|---|---|---|---|
00:00:00.123 | TIME(3) | TIME(6) | 00:00:00.123000 | Повышение точности |
00:00:00.123456 | TIME(6) | TIME(3) | 00:00:00.123 | Снижение точности без переноса |
120:00:00.99666 | TIME(6) | TIME(2) | 120:00:01.00 | Снижение точности с переносом в секунды |
838:59:59.999999 | TIME(6) | TIME(5) | NULL | Перенос вызывает переполнение, полученное значение TIME недопустимо |