跳到主要内容

转换为 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
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 报错(格式错误)不合法的格式,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
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未出现 microsecond 前必须的域
:12:34NULL缺小时
12-34:56.1NULL"-" 不是合法分隔符
12 : 34 : 56NULL非法的空格
76NULL76 秒不合法
200595912NULL20059 小时不合法
8385959.9999999NULL进位后超过上界

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
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 位数字(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
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 不合法

From Datelike Types

From Datetime

行为变更

自 4.0 开始,支持 Datetime 类型转换为 Time 类型。

结果为输入的时间部分,该转换必定合法。

例子

输入 DATETIMECast as TIME(4) 结果
2012-02-05 12:12:12.12345612:12:12.1235

From Time

严格模式

规则描述

低精度向高精度转换时,新出现的小数位补 0,该转换必定合法。

高精度向低精度转换时,将会向前进位,进位可以继续向前传递,如果产生溢出,转换后的值不合法。

错误处理

如果溢出,报错。

例子

假设当前日期为 2025-04-29,则:

输入 TIME源类型目标类型结果 TIMEComment
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源类型目标类型结果 TIMEComment
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