世界中の国やリージョンは経度が異なるため、現地時間も異なり、その結果、異なるタイムゾーンが生まれます。このトピックでは、Hologres のタイムゾーンについて説明します。
タイムゾーンの概要
混乱を避けるため、世界は公式に 24 のタイムゾーン (東に 12、西に 12) に分けられています。イギリスの旧グリニッジ天文台を通る本初子午線が、ゼロタイムゾーンを定義しています。東のタイムゾーンには 1 から 12 (+) の番号が付けられ、西のタイムゾーンには 1 から 12 (-) の番号が付けられています。各タイムゾーンは経度 15 度にわたり、1 時間の差を表します。国際的には、タイムゾーンを表すために GMT と UTC の 2 つの標準が使用されています。
-
GMT 0:00
グリニッジ標準時 (GMT) は、イギリスのグリニッジ天文台での観測に基づいています。かつては世界の標準時として使用されていました。
-
UTC +00:00
協定世界時 (UTC) は、現在の世界の標準時です。地球の自転は徐々に遅くなっており、毎年ほんのわずかな秒数が加わるため、UTC を管理する組織は、人間の知覚を反映する天文時と原子時 (UTC) を一致させるために、定期的にうるう秒を追加します。
-
UTC は特定の場所に関連付けられておらず、現地時間を表すものではありません。現地時間を指定するには、タイムゾーンオフセットを追加する必要があります。したがって、GMT は UTC と等価ではありません。むしろ、GMT は
UTC+0と等しくなります。この関係はGMT = UTC+0と表されます。グリニッジは単にゼロタイムゾーン内に位置しているだけです。 -
+08は UTC+8 タイムゾーンを示し、ゼロタイムゾーンより 8 時間進んでいます。
Hologres は PostgreSQL プロトコルと互換性があり、POSIX タイムゾーン仕様に準拠しています。この仕様では、タイムゾーンオフセットの符号が逆になり、負の符号は東のタイムゾーンを示します。Hologres は、すべての日付と時刻の値を協定世界時 (UTC) で格納します。デフォルトでは、すべてのリージョンで UTC より 8 時間進んでいる UTC-08 タイムゾーン (中国標準時) が使用されます。Hologres は、タイムゾーン情報のない値を格納するための TIMESTAMP と、タイムゾーン情報のある値を格納するための TIMESTAMPTZ の 2 つのデータ型も提供します。
タイムゾーン情報を含むデータには、TIMESTAMPTZ データ型を使用してください。
|
名前 |
説明 |
精度 |
データ表示例 |
TIMESTAMP |
フォーマットは 格納されるデータは書き込まれたデータと同じです。クライアントのタイムゾーンを変更しても、格納された値は変わりません。クライアントは、タイムゾーンオフセットなしで、書き込まれた生のデータを表示します。 |
マイクロ秒 |
2022-01-01 01:01:01.123456 |
|
TIMESTAMP WITH TIME ZONE (TIMESTAMPTZ) |
フォーマットは Hologres は TIMESTAMPTZ データを UTC 値として格納します。TIMESTAMPTZ フィールドに値を挿入すると、Hologres は自動的に値をクライアントのタイムゾーンから UTC に変換します。クエリ結果を表示する際、Hologres はクライアントの TimeZone パラメーターに基づいて UTC 値をクライアントの現地時間に戻します。 |
ミリ秒 |
2022-02-01 10:33:20.125+08 |
デフォルトタイムゾーンの表示
-
現在のクライアントのタイムゾーンを表示します。
show timezone;説明-
HoloWeb では、結果はインスタンスのデフォルトタイムゾーン (PRC) を示し、これは UTC+8 に対応します。
-
他の開発者ツールを使用していて、クエリ結果がデフォルトのタイムゾーンと異なる場合、クライアントのタイムゾーン構成が変更されています。
-
-
システムテーブルをクエリして、各リージョンのタイムゾーンを表示します。
PostgreSQL では、pg_timezone_names システムテーブルに、さまざまなリージョンのデフォルトのタイムゾーン情報が格納されています。次のコマンドを実行してこのシステムテーブルをクエリし、各リージョンのタイムゾーンを表示します。
select * from pg_timezone_names;システムテーブルのパラメーターは以下のとおりです。
パラメーター
型
説明
name
text
タイムゾーン名。
abbrev
text
タイムゾーンの略称。
utc_offset
interval
UTC からのオフセット。正の値 (+) はグリニッジより東を示します。負の値 (-) はグリニッジより西を示します。
is_dst
boolean
現在、夏時間が有効な場合は True (t)。それ以外の場合は False (f)。
クライアントタイムゾーンの変更
-
Hologres は、タイムゾーンを指定するために次のフォーマットをサポートしています。
-
完全なタイムゾーン名 (例: America/New_York)。
-
UTC タイムゾーンオフセット:たとえば、-08:00:00 または UTC-08 のオフセットは、UTC+8 タイムゾーンに対応します。これは、POSIX タイムゾーン仕様が GMT および UTC オフセットの符号を逆にするためです。したがって、負の符号 (-) は UTC より東のタイムゾーンを示します。
-
次の表に、Hologres での一般的なタイムゾーンとそれに対応するパラメーター値を示します。
地域 |
タイムゾーン |
タイムゾーンのフルネーム |
UTC オフセット |
|
UTC+08 |
|
UTC+08 |
日本 (東京) |
UTC+09 |
Asia/Tokyo |
UTC+09 |
インドネシア (ジャカルタ) |
UTC+07 |
Asia/Jakarta |
UTC+07 |
ドイツ (フランクフルト) |
UTC+01 |
Europe/Berlin |
UTC+01 |
米国 (バージニア) |
UTC-05 |
|
UTC-05 |
米国 (シリコンバレー) |
UTC-08 |
|
UTC-08 |
-
クライアントタイムゾーンの変更
デフォルトでは、Hologres は時刻を UTC で格納します。すべてのリージョンのデフォルトタイムゾーンは
UTC+08(中国標準時) です。次のコマンドでタイムゾーンパラメーターを設定することにより、クライアントに表示されるタイムゾーンを変更できます。説明タイムゾーンの変更は、クライアントでの表示方法にのみ影響し、基盤となるストレージの実際のタイムゾーン情報は変更しません。
-
セッションレベル
SET コマンドを使用して、セッションレベルで Grand Unified Configuration (GUC) パラメーターを構成します。セッションレベルのパラメーターは現在のセッションにのみ適用され、接続が閉じられると失効します。SQL 文の前に次のようにコマンドを配置します。
--タイムゾーンを Canada/Eastern に変更します。 set timezone ='Canada/Eastern'; --UTC より西の 5 番目のタイムゾーンに変更します。 set timezone ='05:30:00'; -
データベースレベル
ALTER DATABASE <db_name> SET <value>;コマンドを使用して、データベースレベルで GUC パラメーターを構成します。説明このコマンドを実行した後:
-
設定はデータベース全体に適用されます。変更を有効にするには、切断して再接続する必要があります。
-
設定は新しいデータベースには適用されません。新しいデータベースごとに手動で構成する必要があります。
使用方法は次のとおりです。
-- データベースレベルのタイムゾーンを UTC-0 に変更します。 alter database <db_name> set timezone = 'UTC-0'; -- データベースレベルのタイムゾーンを UTC+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 型は、タイムゾーン情報なしで時刻を格納します。値の範囲は データが格納されるとき、変換なしで元の時刻フォーマットで保存されます。したがって、Hologres の TIMESTAMP 型にマッピングします。 |
TIMESTAMP |
2019-02-23 05:21:16 |
TIMESTAMPTZ |
2019-02-23 05:21:16+08 |
MySQL の TIMESTAMP 型は、デフォルトでタイムゾーン付きの UTC 時刻です。値の範囲は データが格納される前に、書き込まれた時刻データは、データベースソフトウェアのタイムゾーン設定 (デフォルトはシステムタイムゾーン) に基づいて UTC に変換されます。したがって、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 は基盤となるレイヤーでナノ秒をミリ秒に変換するため、精度の問題を心配する必要はありません。 |
|
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 コネクタは、書き込みプロセス中にデータのタイムゾーンを自動的にゼロタイムゾーンに変換します。したがって、Hologres の TIMESTAMPTZ 型にマッピングします。 |
FAQ
-
DataHub から Hologres にリアルタイムでデータを同期すると、Hologres の時刻が実際の時刻より 8 時間遅れます。DataHub と Hologres の両方でフィールドタイプは TIMESTAMP です。
-
原因:Hologres コネクタは、書き込みプロセス中にデータのタイムゾーンを自動的にゼロタイムゾーンに変換します。Hologres のフィールドが TIMESTAMP に設定されている場合、タイムゾーン情報は含まれません。データはゼロタイムゾーンで書き込まれるため、8 時間遅れます。
-
解決策:テーブルを再作成し、Hologres のフィールドタイプを TIMESTAMPTZ に変更します。
-
-
DataHub から Hologres にリアルタイムでデータを同期すると、Tableau で表示される時刻が Hologres の時刻と 8 時間異なります。Hologres のフィールドタイプは TIMESTAMPTZ です。
-
原因:これは Tableau フロントエンドでのタイムゾーン表示の問題です。
-
解決策:HoloWeb は UTC+08 をデフォルトのタイムゾーンとして使用します。HoloWeb でデータの正確性を確認できます。その後、Tableau で接続を確立する際に、[Initial SQL] フィールドで次のコマンドを使用してタイムゾーンを調整できます。
--UTC+8 タイムゾーンで時刻を表示します。 set timezone to 'Asia/Shanghai';
-
-
MySQL から Hologres にデータを同期した後、時刻表示に
+08が表示されるのはなぜですか?-
原因:
+08は、現在のクライアントが UTC+8 タイムゾーンで時刻を表示していることを示します。格納されたデータ自体が UTC+8 タイムゾーンであることを意味するわけではありません。 -
解決策:クライアントのタイムゾーンを目的のタイムゾーンに変更します。
-
-
Java Database Connectivity (JDBC) でタイムゾーンを設定するにはどうすればよいですか?
JDBC で表示されるタイムゾーンは、デフォルトで Java 仮想マシン (JVM) のタイムゾーンになります。JDBC でのタイムゾーン表示を変更するには、JDBC に接続し、次の SQL 文を実行します。
--UTC+7 タイムゾーンに変更します。 set timezone = '+07';