Приведение к типу 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) | Комментарий |
|---|---|---|
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), непосредственно перед приведением используется его фактическое значение. Если число знаков превышает 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), перед приведением используется фактическое значение, которое оно представляет.
Если входное значение отрицательное, результатом будет разобранное значение с противоположным знаком.
Обработка ошибок
Если входное значение невозможно разобрать по указанным правилам и получить допустимое значение 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 |
Приведение из 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.123456789 | TIME(0) | 12:34:56 | Округление до целых секунд |
2024-02-29 12:34:56.123456789 | TIME(3) | 12:34:56.123 | Округление до миллисекунд |
2024-02-29 12:34:56.123456789 | TIME(6) | 12:34:56.123457 | Округление до микросекунд |
1969-12-31 23:59:59.999999999 | TIME(6) | 24:00:00.000000 | Перенос в следующую секунду |