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 年の日付になる |
TIMESTAMP_NS
TIMESTAMP_NS から TIMESTAMPTZ(p) に変換する際、Doris はタイムゾーン情報を持たない TIMESTAMP_NS の値を現在のセッションのタイムゾーンで解釈し、対応する時点に変換してから、ナノ秒部分を変換先の精度 p(0~6)に丸めます。
有効な TIMESTAMP_NS 値はすべて TIMESTAMPTZ の日付範囲内にあるため、厳格モードと非厳格モードのどちらでも変換は常に成功します。入力が NULL の場合は NULL を返します。
time_zone = '+08:00' と仮定します。
| 入力 TIMESTAMP_NS | 変換先の型 | 結果 TIMESTAMPTZ | 説明 |
|---|---|---|---|
2024-02-29 12:34:56.123456499 | Timestamptz(6) | 2024-02-29 12:34:56.123456+08:00 | マイクロ秒単位で切り下げ |
2024-02-29 12:34:56.123456500 | Timestamptz(6) | 2024-02-29 12:34:56.123457+08:00 | マイクロ秒単位で切り上げ |
1969-12-31 23:59:59.999999500 | Timestamptz(6) | 1970-01-01 00:00:00.000000+08:00 | 次の秒へ繰り上がり |
逆方向の変換については、TIMESTAMP_NS 型への変換を参照してください。