メインコンテンツまでスキップ

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 TIMESTAMPTZSource TypeTarget TypeResult 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)Error桁上がりオーバーフロー、年10000の無効な日付を生成

Non-strict Mode

エラーハンドリングを除き、non-strict modeの動作はstrict modeと全く同じです。

ルール説明

低精度から高精度への変換時、新しく現れる小数点以下の桁は0で埋められ、この変換は常に有効です。

高精度から低精度への変換時、丸めが発生し、桁上がりは前方に伝播し続けることがあります。オーバーフローが発生した場合、変換された値は無効です。

エラーハンドリング

オーバーフローが発生した場合、戻り値はNULLです。

Input TIMESTAMPTZSource TypeTarget TypeResult 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

Strict Mode

ルール説明

低精度から高精度への変換時、新しく現れる小数点以下の桁は0で埋められ、この変換は常に有効です。

高精度から低精度への変換時、丸めが発生し、桁上がりは前方に伝播し続けることがあります。オーバーフローが発生した場合、変換された値は無効です。

エラーハンドリング

オーバーフローが発生した場合、エラーが報告されます。

Input DATETIMESource TypeTarget TypeResult 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)Error桁上がりオーバーフロー、年10000の無効な日付を生成

Non-strict Mode

エラーハンドリングを除き、non-strict modeの動作はstrict modeと全く同じです。

ルール説明

低精度から高精度への変換時、新しく現れる小数点以下の桁は0で埋められ、この変換は常に有効です。

高精度から低精度への変換時、丸めが発生し、桁上がりは前方に伝播し続けることがあります。オーバーフローが発生した場合、変換された値は無効です。

エラーハンドリング

オーバーフローが発生した場合、戻り値はNULLです。

Input DATETIMESource TypeTarget TypeResult 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の無効な日付を生成