現地時間は経度によって異なるため、世界はさまざまなタイムゾーンに分かれています。このトピックでは、Hologres がタイムゾーンをどのように処理するかについて説明します。
背景情報
異なるリージョンの時間を測定するために、世界は 24 のタイムゾーンに分割されています。そのうち 12 は東半球に、残りの 12 は西半球にあります。すべてのタイムゾーンは、英国のグリニッジ天文台の時刻であるグリニッジ標準時 (GMT) からのオフセットに基づいて定義されます。東半球のタイムゾーンはプラス記号 (+) のオフセットで表され、西半球のタイムゾーンはマイナス記号 (-) のオフセットで表されます。各タイムゾーンは経度 15 度をカバーします。タイムゾーン内の時刻は、隣接するタイムゾーンの時刻と 1 時間異なります。次の 2 つの時刻標準は、特定のタイムゾーンの時刻の基準として世界的に使用されています。
GMT 0:00
GMT は、英国のグリニッジ天文台で観測される時刻です。GMT は以前、世界中で使用されていた時刻標準でした。
UTC +00:00
協定世界時 (UTC) は、世界的な主要な時刻標準です。時間の経過とともに、地球の自転は遅くなります。したがって、毎年、前年より数十分の 1 秒長くなります。観測時刻が国際原子時 (TAI) から大幅にずれるのを防ぐために、国際地球回転・基準系事業 (IERS) は数年ごとに UTC 時刻にうるう秒を追加します。UTC は GMT に代わって世界的な時刻標準となっています。
-
UTC は特定の地理的な場所に関連付けられておらず、ある場所の現地時間を表すものではありません。現地時間を指定するには、タイムゾーンオフセットを含める必要があります。したがって、GMT は厳密には UTC と等しくありませんが、
UTC+0に相当します。つまり、GMT = UTC+0です。グリニッジ子午線は、単にゼロタイムゾーン内にあります。 UTC+08は、東半球の 8 番目のタイムゾーンを示します。このタイムゾーンでは、時刻は 0 タイムゾーンの時刻より 8 時間進んでいます。
Hologres は PostgreSQL と互換性があります。 PostgreSQL は POSIX タイムゾーン仕様に準拠しています。 GMT または UTC を使用する場合、マイナス記号 (-) をプラス記号 (+) に、プラス記号 (+) をマイナス記号 (-) に切り替える必要があります。 マイナス記号 (-) は東のタイムゾーンを示します。 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 |
クライアントのデフォルトタイムゾーンのクエリ
次の文を実行して、クライアントのタイムゾーンをクエリできます。
show timezone;説明HoloWeb でこの文を実行した場合、デフォルトの戻り値は PRC であり、これは東半球の 8 番目のタイムゾーンを示します。
別の開発ツールを使用していて、クエリ結果がデフォルトのタイムゾーンでない場合、タイムゾーン設定が変更されています。
システムテーブルから、さまざまな国やリージョンのタイムゾーンをクエリできます。
pg_timezone_names という名前の PostgreSQL システムテーブルには、さまざまな国やリージョンのデフォルトタイムゾーンに関する情報が格納されています。次の文を実行して、システムテーブル内のさまざまな国やリージョンのタイムゾーンをクエリできます。
select * from pg_timezone_names;次の表に、システムテーブルのフィールドを示します。
フィールド
データ型
説明
name
text
タイムゾーンの名前。
abbrev
text
タイムゾーンの略称。
utc_offset
interval
タイムゾーンの UTC オフセット。正のオフセットは西半球のタイムゾーンを示します。負のオフセットは東半球のタイムゾーンを示します。
is_dst
boolean
夏時間 (DST) が適用されるかどうかを示します。適用される場合、このパラメーターの値は true です。それ以外の場合、このパラメーターの値は false です。
クライアントのタイムゾーン設定の変更
Hologres では、次のいずれかの方法でタイムゾーンを指定できます。
America/New_York などのタイムゾーンの名前を使用します。
UTC タイムゾーンのオフセットを使用します。たとえば、-08:00:00 または UTC-08 は、東半球の 8 番目のタイムゾーンを示します。Hologres は POSIX タイムゾーン仕様に従います。GMT または UTC を使用する場合、オフセット記号を切り替える必要があります。つまり、マイナス記号 (-) はプラス記号 (+) に、プラス記号 (+) はマイナス記号 (-) になります。マイナス記号 (-) は東半球のタイムゾーンを示します。
次の表に、Hologres の一般的なタイムゾーンを示します。
次の表の UTC オフセットは、POSIX タイムゾーン仕様に従っています。記号は ISO 8601 標準 (例:UTC+8 または UTC-5) とは逆です。たとえば、中国標準時 (ISO 8601 では UTC+8) は、POSIX 形式では UTC-08 として表されます。Hologres で SET timezone コマンドを実行する場合は、POSIX 形式を使用する必要があります。
リージョン |
タイムゾーン |
完全なタイムゾーン名 |
UTC オフセット (POSIX) |
| 東半球第 8 タイムゾーン |
| UTC-08 |
日本 (東京) | 東半球第 9 タイムゾーン | Asia/Tokyo | UTC-09 |
インドネシア (ジャカルタ) | 東半球第 7 タイムゾーン | Asia/Jakarta | UTC-07 |
ドイツ (フランクフルト) | 東半球第 1 タイムゾーン | Europe/Berlin | UTC-01 |
米国 (バージニア) | 西半球第 5 タイムゾーン |
| UTC+05 |
米国 (シリコンバレー) | 西半球第 8 タイムゾーン |
| UTC+08 |
クライアントのタイムゾーン設定を変更します。
デフォルトでは、Hologres のすべてのタイムゾーンは UTC オフセットとして格納されます。すべての Alibaba Cloud リージョンのデフォルトタイムゾーンは
UTC-08です。TimeZone パラメーターを使用して、クライアントのタイムゾーン設定を変更できます。次の文を実行して、クライアントのタイムゾーン設定を変更できます。説明TimeZone パラメーターを設定した後、クライアントに表示されるタイムゾーンのみが変更され、格納されているデータのタイムゾーンは変更されません。
セッションレベルでタイムゾーン設定を変更する
SET コマンドを実行して、セッションレベルで Grand Unified Configuration (GUC) パラメーターを設定できます。パラメーターをセッションレベルで設定した場合、設定は現在のセッションでのみ有効になります。セッションが閉じられると、設定は無効になります。SQL ステートメントの前に SET コマンドを実行することを推奨します。例:
-- タイムゾーンを Canada/Eastern に変更します。 set timezone ='Canada/Eastern'; -- タイムゾーンを西半球の 5 番目のタイムゾーンに変更します。 set timezone ='05:30: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 は、TIMESTAMP 型のデータをデータベースに設定されたタイムゾーンから UTC に変換して格納します。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 コネクタは、書き込み中にデータを自動的に UTC+0 タイムゾーンに変換します。したがって、Hologres の TIMESTAMPTZ 型にマッピングしてください。 |
よくある質問
-
DataHub から Hologres に TIMESTAMP 型のデータをリアルタイムで同期すると、データ型は変更されませんが、Hologres に書き込まれた時刻の値が元の時刻の値より 8 時間早くなるのはなぜですか?
-
考えられる原因:Hologres コネクタは、書き込み中にデータを自動的に UTC+0 タイムゾーンに変換します。ターゲットの Hologres フィールドのデータ型が TIMESTAMP の場合、タイムゾーン情報は格納されないため、挿入された値は UTC+0 時刻として扱われます。これにより、中国標準時と 8 時間の差が生じます。
解決策:Hologres でテーブルを作成し、マッピングされるデータ型を TIMESTAMP から TIMESTAMPTZ に変更します。
-
DataHub から Hologres にリアルタイムでデータを同期すると、データ型は Hologres で TIMESTAMPTZ に変換されます。しかし、Tableau を使用して同期されたデータを表示すると、表示されるデータが Hologres に格納されているデータと 8 時間のオフセットがあるのはなぜですか?
考えられる原因:Tableau のデータページに表示されるタイムゾーンが不適切です。
解決策:HoloWeb のデフォルトタイムゾーンは UTC-08 です。HoloWeb に移動して、表示されるタイムゾーンがビジネスデータに適しているかどうかを確認してください。Initial SQL 機能を使用して Tableau を Hologres に接続する際に、タイムゾーン設定を変更できます。ステートメントの例:
-- タイムゾーンを東半球の 8 番目のタイムゾーンに変更します。 set timezone to 'Asia/Shanghai';
MySQL から Hologres にデータを同期した後、Hologres に表示される時刻データに
+08という値が含まれるのはなぜですか?考えられる原因:
+08という値は、同期されたデータのタイムゾーンではなく、現在のクライアントのタイムゾーンを示します。解決策:ビジネス要件に基づいて、クライアントのタイムゾーン設定を変更します。
Java Database Connectivity (JDBC) でタイムゾーン設定を変更するにはどうすればよいですか?
デフォルトでは、JDBC に表示されるタイムゾーンは Java 仮想マシン (JVM) のタイムゾーンと同じです。JDBC でタイムゾーン設定を変更する場合は、JDBC を使用して Hologres に接続し、次の文を実行します。
-- タイムゾーンを東半球の 7 番目のタイムゾーンに変更します。 set timezone = '+07';