跳到主要内容

转换为 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 年的非法日期