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 となります。
詳細な変換ルールについては、Convert to DATETIME Type のドキュメントを参照してください。
Datelike型から
Datetime型からTimestamptz型への変換をサポートします。変換中、DATETIMEは現在のセッションのタイムゾーンに基づいてUTC時刻に変換されます。DATETIME値は有効であっても、UTC時刻への変換後の値が無効になる場合があります。
Timestamptzは異なる精度値を持つため、異なる精度のTimestamptz型間の変換もあります。
Timestamptz
Strict Mode
ルール説明
低精度から高精度への変換時、新しく現れる小数点以下の桁は0で埋められ、この変換は常に有効です。
高精度から低精度への変換時、丸めが発生し、桁上がりは前方に伝播し続けることがあります。オーバーフローが発生した場合、変換された値は無効です。
エラーハンドリング
オーバーフローが発生した場合、エラーが報告されます。
例
| Input TIMESTAMPTZ | Source Type | Target Type | Result 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) | Error | 桁上がりオーバーフロー、年10000の無効な日付を生成 |
Non-strict Mode
エラーハンドリングを除き、non-strict modeの動作はstrict modeと全く同じです。
ルール説明
低精度から高精度への変換時、新しく現れる小数点以下の桁は0で埋められ、この変換は常に有効です。
高精度から低精度への変換時、丸めが発生し、桁上がりは前方に伝播し続けることがあります。オーバーフローが発生した場合、変換された値は無効です。
エラーハンドリング
オーバーフローが発生した場合、戻り値はNULLです。
例
| Input TIMESTAMPTZ | Source Type | Target Type | Result 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
Strict Mode
ルール説明
低精度から高精度への変換時、新しく現れる小数点以下の桁は0で埋められ、この変換は常に有効です。
高精度から低精度への変換時、丸めが発生し、桁上がりは前方に伝播し続けることがあります。オーバーフローが発生した場合、変換された値は無効です。
エラーハンドリング
オーバーフローが発生した場合、エラーが報告されます。
例
| Input DATETIME | Source Type | Target Type | Result 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) | Error | 桁上がりオーバーフロー、年10000の無効な日付を生成 |
Non-strict Mode
エラーハンドリングを除き、non-strict modeの動作はstrict modeと全く同じです。
ルール説明
低精度から高精度への変換時、新しく現れる小数点以下の桁は0で埋められ、この変換は常に有効です。
高精度から低精度への変換時、丸めが発生し、桁上がりは前方に伝播し続けることがあります。オーバーフローが発生した場合、変換された値は無効です。
エラーハンドリング
オーバーフローが発生した場合、戻り値はNULLです。
例
| Input DATETIME | Source Type | Target Type | Result 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の無効な日付を生成 |