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 型への変換を参照してください。
日時型からの変換
Datetime 型から Timestamptz 型への変換をサポートします。変換時には、現在のセッションのタイムゾーンに基づいて DATETIME を UTC に変換します。DATETIME 値としては有効でも、UTC に変換した値が無効になる場合があります。
Timestamptz には複数の精度があるため、精度が異なる Timestamptz 型の間でも変換できます。
Timestamptz
厳格モード
変換規則
低い精度から高い精度に変換する場合、新たに増える小数桁は 0 で埋められます。この変換は常に有効です。
高い精度から低い精度に変換する場合は丸め処理が行われ、繰り上がりがさらに上位の桁へ伝わることがあります。オーバーフローが発生すると、変換後の値は無効になります。
エラー処理
オーバーフローが発生すると、エラーが報告されます。
例
| 入力 TIMESTAMPTZ | 変換元の型 | 変換先の型 | 結果の TIMESTAMPTZ | 説明 |
|---|---|---|---|---|
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 の無効な日付になる |
非厳格モード
エラー処理を除き、非厳格モードの動作は厳格モードとまったく同じです。
変換規則
低い精度から高い精度に変換する場合、新たに増える小数桁は 0 で埋められます。この変換は常に有効です。
高い精度から低い精度に変換する場合は丸め処理が行われ、繰り上がりがさらに上位の桁へ伝わることがあります。オーバーフローが発生すると、変換後の値は無効になります。
エラー処理
オーバーフローが発生すると、戻り値は NULL になります。
例
| 入力 TIMESTAMPTZ | 変換元の型 | 変換先の型 | 結果の TIMESTAMPTZ | 説明 |
|---|---|---|---|---|
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 | 説明 |
|---|---|---|---|---|
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 の無効な日付になる |
非厳格モード
エラー処理を除き、非厳格モードの動作は厳格モードとまったく同じです。
変換規則
低い精度から高い精度に変換する場合、新たに増える小数桁は 0 で埋められます。この変換は常に有効です。
高い精度から低い精度に変換する場合は丸め処理が行われ、繰り上がりがさらに上位の桁へ伝わることがあります。オーバーフローが発生すると、変換後の値は無効になります。
エラー処理
オーバーフローが発生すると、戻り値は NULL になります。
例
| 入力 DATETIME | 変換元の型 | 変換先の型 | 結果の TIMESTAMPTZ | 説明 |
|---|---|---|---|---|
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 の無効な日付になる |