跳到主要内容
版本:26.x

转换为 TIMESTAMPTZ 类型

将字符串和数字类型转换为 TIMESTAMPTZ 类型的规则与转换为 DATETIME 类型几乎完全一样,区别在于转换成 TIMESTAMPTZ 时,最终会将转换后的 DATETIME 值转换成UTC时间,有可能出现 DATETIME 的值合法,但是转换成UTC时间后的值不合法的情况。例如:

set time_zone="+08:00";

select cast("0000-01-01 00:00:00+08:00" as datetimev2);
+-------------------------------------------------+
| cast("0000-01-01 00:00:00+08:00" as datetimev2) |
+-------------------------------------------------+
| 0000-01-01 00:00:00 |
+-------------------------------------------------+
1 row in set (0.00 sec)

select cast("0000-01-01 00:00:00+08:00" as timestamptz);
+--------------------------------------------------+
| cast("0000-01-01 00:00:00+08:00" as timestamptz) |
+--------------------------------------------------+
| NULL |
+--------------------------------------------------+
1 row in set (0.04 sec)

字符串0000-01-01 00:00:00+08:00是一个合法的 DATETIME 值,但是转换成UTC时间后会超出合法范围,最终结果是NULL。

详细转换规则参见转换为 DATETIME 类型文档。

From Datelike Types​

支持 Datetime 类型转换为 Timestamptz 类型,转换时,根据前会话的时区将 DATETIME 转换成UTC时间,有可能出现 DATETIME 的值合法,但是转换成UTC时间后的值不合法的情况。

由于 Timestamptz 具有不同的精度取值,还存在不同精度的 Timestamptz 之间的转换。

Timestamptz​

严格模式​

规则描述​

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

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

错误处理​

如果溢出,报错。

例子​
输入 TIMESTAMPTZ源类型目标类型结果 TIMESTAMPTZComment
2020-12-12 00:00:00.123+08:00Timestamptz(3)Timestamptz(6)2020-12-12 00:00:00.123000+08:00扩充精度
2020-12-12 00:00:00.123456+08:00Timestamptz(6)Timestamptz(3)2020-12-12 00:00:00.123+08:00降低精度,无进位
2020-12-12 00:00:00.996666+08:00Timestamptz(6)Timestamptz(2)2020-12-12 00:00:01.00+08:00降低精度,进位到秒
9999-12-31 23:59:59.999999+08:00Timestamptz(6)Timestamptz(5)报错进位溢出,产生 10000 年的非法日期

非严格模式​

除错误处理外,非严格模式的行为同严格模式完全一致。

规则描述​

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

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

错误处理​

如果溢出,返回值为 NULL。

例子​
输入 TIMESTAMPTZ源类型目标类型结果 TIMESTAMPTZComment
2020-12-12 00:00:00.123+08:00Timestamptz(3)Timestamptz(6)2020-12-12 00:00:00.123000+08:00扩充精度
2020-12-12 00:00:00.123456+08:00Timestamptz(6)Timestamptz(3)2020-12-12 00:00:00.123+08:00降低精度,无进位
2020-12-12 00:00:00.99666+08:00Timestamptz(6)Timestamptz(2)2020-12-12 00:00:01.00+08:00降低精度,进位到秒
9999-12-31 23:59:59.999999+08:00Timestamptz(6)Timestamptz(5)NULL进位溢出,产生 10000 年的非法日期

Datetime​

严格模式​

规则描述​

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

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

错误处理​

如果溢出,报错。

例子​
输入 DATETIME源类型目标类型结果 TIMESTAMPTZComment
2020-12-12 00:00:00.123Datetime(3)Timestamptz(6)2020-12-12 00:00:00.123000+08:00扩充精度
2020-12-12 00:00:00.123456Datetime(6)Timestamptz(3)2020-12-12 00:00:00.123+08:00降低精度,无进位
2020-12-12 00:00:00.99666Datetime(6)Timestamptz(2)2020-12-12 00:00:01.00+08:00降低精度,进位到秒
9999-12-31 23:59:59.999999Datetime(6)Timestamptz(5)报错进位溢出,产生 10000 年的非法日期

非严格模式​

除错误处理外,非严格模式的行为同严格模式完全一致。

规则描述​

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

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

错误处理​

如果溢出,返回值为 NULL。

例子​
输入 DATETIME源类型目标类型结果 TIMESTAMPTZComment
2020-12-12 00:00:00.123Datetime(3)Timestamptz(6)2020-12-12 00:00:00.123000+08:00扩充精度
2020-12-12 00:00:00.123456Datetime(6)Timestamptz(3)2020-12-12 00:00:00.123+08:00降低精度,无进位
2020-12-12 00:00:00.99666Datetime(6)Timestamptz(2)2020-12-12 00:00:01.00+08:00降低精度,进位到秒
9999-12-31 23:59:59.999999Datetime(6)Timestamptz(5)NULL进位溢出,产生 10000 年的非法日期