世界中の国と地域は、経度と現地時間に基づいて異なるタイムゾーンに分類されます。このトピックでは、Hologres のタイムゾーンに関連するシステムパラメータについて説明します。
背景情報
異なる地域での時間を測定するために、世界は 24 のタイムゾーンに分割されています。そのうち 12 は東半球にあり、残りの 12 は西半球にあります。すべてのタイムゾーンは、グリニッジ標準時 (GMT) からのオフセットに基づいて定義されます。GMT は、英国グリニッジの王立天文台の時間です。東半球のタイムゾーンはプラス記号 (+
) のオフセットで表され、西半球のタイムゾーンはマイナス記号 (-
) のオフセットで表されます。各タイムゾーンは経度 15 度をカバーしています。タイムゾーンの時間は、隣接するタイムゾーンの時間と 1 時間異なります。次の 2 つの時間標準は、特定のタイムゾーンの時間の基準として広く使用されています。
GMT 0:00
GMT は、英国グリニッジの王立天文台で観測された時間です。GMT は以前、世界中で使用されていた時間標準でした。
UTC +00:00
協定世界時 (UTC) は、世界中で使用されている主要な時間標準です。時間の経過とともに、地球の自転は遅くなります。したがって、毎年は前年よりも 10 分の 1 秒長くなります。観測時間が国際原子時 (TAI) から大きくずれるのを防ぐために、国際地球回転・基準系事業 (IERS) は数年ごとに UTC 時間にうるう秒を追加します。UTC は、世界的な時間標準として GMT に取って代わりました。
GMT とは異なり、UTC は特定の地域の時間ではありません。タイムゾーンの時間を表すために UTC を使用する場合は、タイムゾーンを示すためにプラス記号 (+) またはマイナス記号 (-) の整数を追加する必要があります。たとえば、
UTC+0
を使用して GMT を参照できます。これは、UTC
からのオフセットがないことを意味します。UTC+08
は、東半球の 8 番目のタイムゾーンを示します。このタイムゾーンでは、時間は 0 タイムゾーンよりも 8 時間進んでいます。
Hologres は PostgreSQL と互換性があります。PostgreSQL は POSIX タイムゾーン仕様に準拠しています。マイナス記号 (-) がプラス記号 (+) になり、プラス記号 (+) がマイナス記号 (-) になるように、オフセット記号を切り替える必要があります。負の記号は東のタイムゾーンを示し、正の記号は西のタイムゾーンを示します。Hologres では、すべての日付と時刻の値は UTC を使用してタイムゾーンを指定します。タイムゾーンが指定されていない場合、すべての Alibaba Cloud リージョンでデフォルトのタイムゾーン UTC-08
が使用されます。UTC-8 は東半球の 8 番目のタイムゾーンです。UTC-08 の時間は、UTC+0 または GMT の時間よりも 8 時間進んでいます。Hologres は、TIMESTAMP と TIMESTAMPTZ の 2 つのタイムスタンプデータ型をサポートしています。タイムゾーンは TIMESTAMP では指定されませんが、TIMESTAMPTZ では指定されます。
タイムゾーンを持つデータには、TIMESTAMPTZ データ型を使用することをお勧めします。
データ型 | 説明 | 精度 | 例 |
TIMESTAMP | タイムゾーンを指定せずに、 このデータ型は、格納されたタイムスタンプ値がクライアントに指定されたタイムゾーンに基づいて変更されないようにします。クライアントに格納されているタイムスタンプ値は、クライアントに書き込まれた値と同じであり、タイムゾーン情報は含まれていません。 | マイクロ秒 | 2022-01-01 01:01:01.123456 |
TIMESTAMPTZ (TIMESTAMP WITH TIME ZONE の略) | タイムスタンプ値を Hologres は、タイムゾーンを指定するために UTC を使用します。Hologres の TIMESTAMPTZ 型の列に値を書き込むと、Hologres はクライアントタイムゾーンの時間を UTC+0 タイムゾーンに自動的に変換します。クライアントでタイムスタンプ値をクエリすると、Hologres は TimeZone パラメータに基づいて UTC+0 の時間値をクライアントタイムゾーンに戻します。 | ミリ秒 | 2022-02-01 10:33:20.125+08 |
クライアントのデフォルトタイムゾーンのクエリ
次のステートメントを実行して、クライアントのデフォルトタイムゾーンをクエリできます。
HoloWeb でステートメントを実行すると、デフォルトの戻り値は PRC で、これは
UTC-08
を示します。別の開発ツールを使用していて、クエリ結果がデフォルトのタイムゾーンでない場合は、タイムゾーン設定が変更されています。
show timezone;
クライアントのタイムゾーン設定の変更
関連するシステムテーブルを使用する
pg_timezone_names という名前の PostgreSQL システムテーブルには、さまざまな国と地域のデフォルトタイムゾーンに関する情報が格納されています。次のステートメントを実行して、システムテーブル内のさまざまな国と地域のタイムゾーンをクエリできます。
select * from pg_timezone_names;
次の表に、システムテーブルのフィールドを示します。
フィールド
データ型
説明
name
text
タイムゾーンの名前。
abbrev
text
タイムゾーンの略語。
utc_offset
interval
タイムゾーンの UTC オフセット。正のオフセットは西半球のタイムゾーンを示します。負のオフセットは東半球のタイムゾーンを示します。
is_dst
boolean
夏時間が適用されているかどうかを示します。適用されている場合、このパラメータの値は true です。それ以外の場合、このパラメータの値は false です。
次の表に、Hologres の一般的なタイムゾーンを示します。
地域
タイムゾーン
タイムゾーンのフルネーム
UTC+0 からのオフセット
中国のすべての地域
シンガポール
マレーシア (クアラルンプール)
東半球の 8 番目のタイムゾーン
PRC
Asia/Shanghai
Asia/Singapore
Asia/Kuala_Lumpur
UTC-08
日本 (東京)
東半球の 9 番目のタイムゾーン
Asia/Tokyo
UTC-09
インドネシア (ジャカルタ)
東半球の 7 番目のタイムゾーン
Asia/Jakarta
UTC-07
ドイツ (フランクフルト)
東半球の 1 番目のタイムゾーン
Europe/Berlin
UTC-01
米国 (バージニア)
西半球の 5 番目のタイムゾーン
US/Eastern
America/New_York
UTC+05
米国 (シリコンバレー)
西半球の 8 番目のタイムゾーン
US/Pacific
America/Los_Angeles
UTC+08
クライアントのタイムゾーン設定を変更する
デフォルトでは、Hologres のすべてのタイムゾーンは UTC オフセットとして格納されます。すべての Alibaba Cloud リージョンのデフォルトタイムゾーンは
UTC-08
です。TimeZone パラメータを使用して、クライアントのタイムゾーン設定を変更できます。次のステートメントを実行して、クライアントのタイムゾーン設定を変更できます。説明TimeZone パラメータを設定した後、クライアントに表示されるタイムゾーンのみが変更され、格納されているデータのタイムゾーンは変更されません。
HoloWeb に表示されるデフォルトのタイムゾーンは
UTC-08
です。
セッションレベルでタイムゾーン設定を変更する
SET コマンドを実行して、セッションレベルで Grand Unified Configuration (GUC) パラメータを設定できます。セッションレベルでパラメータを設定すると、設定は現在のセッションでのみ有効になります。セッションが閉じられると、設定は無効になります。SQL ステートメントの前に SET コマンドを実行することをお勧めします。例:
-- タイムゾーンを Canada/Eastern に変更します。 set timezone ='Canada/Eastern'; -- タイムゾーンを東半球の 5 番目のタイムゾーンに変更します。 set timezone ='05:00:00';
データベースのタイムゾーン設定を変更する
alter database <db_name> set <value>;
ステートメントを実行して、データベースの GUC パラメータを設定できます。説明ステートメントを実行するときは、次の項目に注意してください。
データベースの変更を有効にするには、データベースをクライアントから切断してから、データベースをクライアントに再接続します。
変更は新しいデータベースに自動的に適用されません。新しいデータベースの GUC パラメータを手動で設定する必要があります。
例:
-- データベースのタイムゾーンを UTC+0 に変更します。 alter database <db_name> set timezone = 'UTC-0'; -- データベースのタイムゾーンを西半球の 5 番目のタイムゾーンに変更します。 alter database <db_name> set timezone = 'UTC+05';
Hologres と他のデータソース間の時間関連データ型のマッピング
次の表に、Hologres と他のデータソース間の時間関連データ型のマッピングを示します。マッピングに基づいてデータ型がマッピングされていない場合、データまたはタイムゾーンの不整合が発生します。
データソース | データソースのデータ型 | ソースデータの例 | Hologres のデータ型 | Hologres でのマッピングされた例 | 説明 |
MySQL | DATETIME | 2001-07-14 02:14:19 | TIMESTAMP | 2001-07-14 02:14:19 | MySQL の DATETIME 型のデータには、タイムゾーン値が含まれていません。このタイプのデータは文字列と見なすことができます。有効な値の範囲は、 MySQL は DATETIME 型のデータを元の形式で格納します。このタイプのデータは、Hologres の TIMESTAMP 型のデータにマッピングされます。 |
TIMESTAMP | 2019-02-23 05:21:16 | TIMESTAMPTZ | 2019-02-23 05:21:16+08 | デフォルトでは、MySQL の TIMESTAMP 型のデータは UTC 形式に従い、タイムゾーン値が含まれています。有効な値の範囲は、 MySQL は、データベースに設定されたタイムゾーンから UTC に TIMESTAMP 型のデータを変換して格納します。MySQL では、デフォルトのタイムゾーン値はクライアントのタイムゾーン値です。このデータ型は、Hologres の TIMESTAMPTZ にマッピングされます。 | |
MaxCompute | DATETIME | 2021-11-29 00:01:00 | TIMESTAMPTZ | 2021-11-29 00:01:00.000+08 | デフォルトでは、MaxCompute の DATETIME 型のデータは UTC 形式に従い、ミリ秒単位の精度です。有効な値の範囲は、 |
TIMESTAMP | 2021-01-11 00:00:00.123456789 | TIMESTAMPTZ | 2021-01-11 00:00:00.123+08 | デフォルトでは、MaxCompute の TIMESTAMP 型のデータは UTC 形式に従い、ナノ秒単位の精度です。有効な値の範囲は、 説明 Hologres の基盤となるレイヤーは、ナノ秒をミリ秒に自動的に変換します。したがって、Hologres のデータ精度に注意を払う必要はありません。 | |
Flink | TIMESTAMP | 2007-04-30 13:10:02.047 | TIMESTAMPTZ | 2007-04-30 13:10:02.047+08 | デフォルトでは、Flink の TIMESTAMP 型のデータは UTC 形式に従い、ミリ秒単位の精度です。このデータ型は、Hologres の TIMESTAMPTZ にマッピングされます。 |
DataHub | TIMESTAMP | 2020-03-05 10:10:00.123456+08 | TIMESTAMPTZ | 2020-03-05 10:10:00.123+08 | DataHub の TIMESTAMP 型のデータは UTC 形式に従い、マイクロ秒単位の精度です。Hologres コネクタを使用して TIMESTAMP 型のデータを Hologres に書き込むと、Hologres はデータのタイムゾーン値を UTC+0 に自動的に変換します。このデータ型は、Hologres の TIMESTAMPTZ にマッピングされます。 |
FAQ
DataHub から Hologres に TIMESTAMP 型のデータをリアルタイムで同期すると、データ型は変更されませんが、Hologres に書き込まれる時間値は元の時間値よりも 8 時間早くなります。なぜですか?
考えられる原因: データを書き込むときに、Hologres コネクタは元のデータのタイムゾーン値を UTC+0 に自動的に変換します。Hologres で TIMESTAMP データ型を使用する場合、TIMESTAMP 型のデータにはタイムゾーン値が含まれていないため、Hologres に書き込まれる時間値は UTC+0 と見なされます。UTC+0 タイムゾーンは、Hologres のデフォルトタイムゾーンよりも 8 時間早いです。
解決策: Hologres にテーブルを作成し、マッピングされたデータ型を TIMESTAMP から TIMESTAMPTZ に変更します。
DataHub から Hologres にデータをリアルタイムで同期すると、データ型は Hologres で TIMESTAMPTZ に変換されます。ただし、Tableau を使用して同期されたデータを表示すると、表示されるデータは Hologres に格納されているデータと 8 時間のオフセットがあります。なぜですか?
考えられる原因: Tableau のデータページに表示されるタイムゾーンが不適切です。
解決策: HoloWeb のデフォルトタイムゾーンは UTC+08 です。HoloWeb にアクセスして、表示されているタイムゾーンがビジネスデータに適しているかどうかを確認します。[初期 SQL] 機能を使用して Tableau を Hologres に接続するときに、タイムゾーン設定を変更できます。ステートメントの例:
-- Tableau に表示されるタイムゾーンを UTC+08 に変更します。 set timezone to 'Asia/Shanghai';
MySQL から Hologres にデータを同期した後、Hologres に表示される時間データに
+08
の値が含まれるのはなぜですか?考えられる原因:
+08
の値は、同期されたデータのタイムゾーンではなく、現在のクライアントのタイムゾーンを示します。解決策: ビジネス要件に基づいて、クライアントのタイムゾーン設定を変更します。
Java Database Connectivity (JDBC) でタイムゾーン設定を変更するにはどうすればよいですか?
デフォルトでは、JDBC に表示されるタイムゾーンは Java Virtual Machine (JVM) のタイムゾーンと同じです。JDBC でタイムゾーン設定を変更する場合は、JDBC を使用して Hologres に接続し、次のステートメントを実行します。
-- タイムゾーンを UTC+07 に変更します。 set timezone = '+07';