转换为 TIME
Time 类型的合法范围为 [-838:59:59.999999, 838:59:59.999999]
。
TIME 类型包含类型参数 p
,即小数位数。完整表示为 TIME(p)
类型。例如 TIME(6) 表示支持到微秒精度的 TIME 类型。
FROM 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 类型值域,报错。
例子
字符串 | Cast as TIME(6) 结果 | Comment |
---|---|---|
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 | 报错(格式错误) | 不合法的格式,BNF 不匹配空格 |
.123 | 报错(格式错误) | 未出现 microsecond 前必须的域 |
:12:34 | 报错(格式错误) | 缺小时 |
12-34:56.1 | 报错(格式错误) | "-" 不是合法分隔符 |
12 : 34 : 56 | 报错(格式错误) | 非法的空格 |
76 | 报错(值域错误) | 76 秒不合法 |
200595912 | 报错(值域错误) | 20059 小时不合法 |
8385959.9999999 | 报错(值域错误) | 进位后超过上界 |
非严格模式
自 4.0 开始,DECIMAL 类型按照其字面数值表示进行转换。支持解析 <microsecond> 域到微秒。任意格式越界以后均认为是错误,执行错误处理。
除错误处理外,非严格模式的行为同严格模式完全一致。
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 分支,返回 NULL 值。
-
值域错误:结果不为合法的时间,或者超出 TIME 类型值域,返回 NULL 值。
例子
字符串 | Cast as TIME(6) 结果 | Comment |
---|---|---|
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 | 未出现 microsecond 前必须的域 |
:12:34 | NULL | 缺小时 |
12-34:56.1 | NULL | "-" 不是合法分隔符 |
12 : 34 : 56 | NULL | 非法的空格 |
76 | NULL | 76 秒不合法 |
200595912 | NULL | 20059 小时不合法 |
8385959.9999999 | NULL | 进位后超过上界 |
From Numeric
支持所有数字类型转换为 TIME 类型。
自 4.0 开始,Doris 支持解析小数部分,且支持任意数字类型转换到 Time 类型。
严格模式
规则描述
合法格式
对于整数位,将数字从低位到高位,从时间最右端向左填充。以下是合法格式及其对应的填充结果(不含微秒部分):
1 位数字(a) 00:00:0a
2 位数字(ab) 00:00:ab
3 位数字(abc) 00:0a:bc
4 位数字(abcd) 00:ab:cd
5 位数字(abcde) 0a:bc:de
6 位数字(abcdef) ab:cd:ef
7 位数字(abcdefg) abc:de:fg
对于小数位,将数字从高位到低位,从日期小数点后最左端(百毫秒位)向右填充。如果小数为非精确表示类型(float、double),我们将按照其 Cast 前实际表示的值直接使用。位数超过 p
的部分会四舍五入到小数点后 p
位。
如果输入为负,则结果为按规则解析后取反。
错误处理
当输入按规则解析后不能得到合法的 TIME 值时,报错。
例子
数字 | Cast as TIME(3) 结果 | Comment |
---|---|---|
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 位数字(a) 00:00:0a
2 位数字(ab) 00:00:ab
3 位数字(abc) 00:0a:bc
4 位数字(abcd) 00:ab:cd
5 位数字(abcde) 0a:bc:de
6 位数字(abcdef) ab:cd:ef
7 位数字(abcdefg) abc:de:fg
对于小数位,将数字从高位到低位,从日期小数点后最左端(百毫秒位)向右填充。如果小数为非精确表示类型(float、double),我们将按照其 Cast 前实际表示的值直接使用。位数超过 p
的部分会四舍五入到小数点后 p
位。
如果输入为负,则结果为按规则解析后取反。
错误处理
当输入按规则解析后不能得到合法的 TIME 值时,返回值为 NULL。
例子
数字 | Cast as TIME(3) 结果 | Comment |
---|---|---|
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 不合法 |
From Datelike Types
From Datetime
自 4.0 开始,支持 Datetime 类型转换为 Time 类型。
结果为输入的时间部分,该转换必定合法。
例子
输入 DATETIME | Cast as TIME(4) 结果 |
---|---|
2012-02-05 12:12:12.123456 | 12:12:12.1235 |
From Time
严格模式
规则描述
低精度向高精度转换时,新出现的小数位补 0,该转换必定合法。
高精度向低精度转换时,将会向前进位,进位可以继续向前传递,如果产生溢出,转换后的值不合法。
错误处理
如果溢出,报错。
例子
假设当前日期为 2025-04-29,则:
输入 TIME | 源类型 | 目标类型 | 结果 TIME | Comment |
---|---|---|---|---|
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 | Comment |
---|---|---|---|---|
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 |