转换为 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 | 源类型 | 目标类型 | 结果 TIMESTAMPTZ | Comment |
|---|---|---|---|---|
2020-12-12 00:00:00.123+08:00 | Timestamptz(3) | Timestamptz(6) | 2020-12-12 00:00:00.123000+08:00 | 扩充精度 |
2020-12-12 00:00:00.123456+08:00 | Timestamptz(6) | Timestamptz(3) | 2020-12-12 00:00:00.123+08:00 | 降低精度,无进位 |
2020-12-12 00:00:00.996666+08:00 | Timestamptz(6) | Timestamptz(2) | 2020-12-12 00:00:01.00+08:00 | 降低精度,进位到秒 |
9999-12-31 23:59:59.999999+08:00 | Timestamptz(6) | Timestamptz(5) | 报错 | 进位溢出,产生 10000 年的非法日期 |
非严格模式
除错误处理外,非严格模式的行为同严格模式完全一致。
规则描述
低精度向高精度转换时,新出现的小数位补 0,该转换必定合法。
高精度向低精度转换时,将会向前进位,进位可以继续向前传递,如果产生溢出,转换后的值不合法。
错误处理
如果溢出,返回值为 NULL。
例子
| 输入 TIMESTAMPTZ | 源类型 | 目标类型 | 结果 TIMESTAMPTZ | Comment |
|---|---|---|---|---|
2020-12-12 00:00:00.123+08:00 | Timestamptz(3) | Timestamptz(6) | 2020-12-12 00:00:00.123000+08:00 | 扩充精度 |
2020-12-12 00:00:00.123456+08:00 | Timestamptz(6) | Timestamptz(3) | 2020-12-12 00:00:00.123+08:00 | 降低精度,无进位 |
2020-12-12 00:00:00.99666+08:00 | Timestamptz(6) | Timestamptz(2) | 2020-12-12 00:00:01.00+08:00 | 降低精度,进位到秒 |
9999-12-31 23:59:59.999999+08:00 | Timestamptz(6) | Timestamptz(5) | NULL | 进位溢出,产生 10000 年的非法日期 |
Datetime
严格模式
规则描述
低精度向高精度转换时,新出现的小数位补 0,该转换必定合法。
高精度向低精度转换时,将会向前进位,进位可以继续向前传递,如果产生溢出,转换后的值不合法。
错误处理
如果溢出,报错。
例子
| 输入 DATETIME | 源类型 | 目标类型 | 结果 TIMESTAMPTZ | Comment |
|---|---|---|---|---|
2020-12-12 00:00:00.123 | Datetime(3) | Timestamptz(6) | 2020-12-12 00:00:00.123000+08:00 | 扩充精度 |
2020-12-12 00:00:00.123456 | Datetime(6) | Timestamptz(3) | 2020-12-12 00:00:00.123+08:00 | 降低精度,无进位 |
2020-12-12 00:00:00.99666 | Datetime(6) | Timestamptz(2) | 2020-12-12 00:00:01.00+08:00 | 降低精度,进位到秒 |
9999-12-31 23:59:59.999999 | Datetime(6) | Timestamptz(5) | 报错 | 进位溢出,产生 10000 年的非法日期 |
非严格模式
除错误处理外,非严格模式的行为同严格模式完全一致。
规则描述
低精度向高精度转换时,新出现的小数位补 0,该转换必定合法。
高精度向低精度转换时,将会向前进位,进位可以继续向前传递,如果产生溢出,转换后的值不合法。
错误处理
如果溢出,返回值为 NULL。
例子
| 输入 DATETIME | 源类型 | 目标类型 | 结果 TIMESTAMPTZ | Comment |
|---|---|---|---|---|
2020-12-12 00:00:00.123 | Datetime(3) | Timestamptz(6) | 2020-12-12 00:00:00.123000+08:00 | 扩充精度 |
2020-12-12 00:00:00.123456 | Datetime(6) | Timestamptz(3) | 2020-12-12 00:00:00.123+08:00 | 降低精度,无进位 |
2020-12-12 00:00:00.99666 | Datetime(6) | Timestamptz(2) | 2020-12-12 00:00:01.00+08:00 | 降低精度,进位到秒 |
9999-12-31 23:59:59.999999 | Datetime(6) | Timestamptz(5) | NULL | 进位溢出,产生 10000 年的非法日期 |