由於世界各國家與地區所處經度不同,地方時也不同,因此會劃分為不同的時區。本文將會為您介紹在Hologres中時區的相關資訊。
時區介紹
為了克服時間上的混亂,正式的時區劃分包括二十四個時區(東、西各十二個時區),其中英國(格林尼治天文台舊址)為中時區(零時區)、東1~12區(正數,+),西1~12區(負數,-)。每個時區橫跨經度十五度,時間正好是一小時。在國際上有兩種時區的表達,分別為GMT和UTC。
-
GMT 0:00
是指格林尼治標準時間,這是以英國格林尼治天文台觀測結果得出的時間,這是英國格林尼治當地時間,這個地方的當地時間過去被當成世界標準時間。
-
UTC +00:00
是指國際標準時間。因為地球自轉越來越慢,每年都會比前一年多出零點幾秒,每隔幾年國際標準時間組織都會給世界時加一秒,讓基於原子鐘的世界時和基於天文學(人類感知)的格林尼治標準時間相差不至於太大。並將得到的時間稱為UTC,這是現在使用的世界標準時間。
-
國際標準時間不與任何地區位置相關,也不代表此刻某地的時間,所以在說明某地時間時要加上時區。也就是說GMT並不等於UTC,而是等於
UTC+0,即GMT = UTC+0,只是格林尼治剛好在零時區上。 -
+08是指時區為東八區,比零時區快八個小時。
Hologres相容PostgreSQL協議。PostgreSQL遵循POSIX時區規範,在使用GMT、UTC修改時區時,其位移量符號與上述符號相反,即負號表示東時區。在Hologres中所有日期和時間都用全球統一時間UTC格式儲存,所有Region預設是UTC-08(中國東八區時間),比世界協調時間(UTC)和格林尼治時間(GMT)快八小時的時區。同時Hologres提供兩種儲存時間戳記的資料類型:不帶時區的TIMESTAMP和帶時區的TIMESTAMPTZ。
帶有時區的資料建議都使用TIMESTAMPTZ類型儲存。
|
名稱 |
說明 |
精度 |
資料顯示樣本 |
|
TIMESTAMP |
格式為 儲存的資料與寫入的資料一樣,當修改了用戶端的時區時,裡面儲存的資料的值不會改變,即用戶端展示的是寫入的未經處理資料,沒有時區位移。 |
微秒 |
2022-01-01 01:01:01.123456 |
|
TIMESTAMP WITH TIME ZONE(TIMESTAMPTZ) |
格式為 Hologres使用UTC時區的值來儲存TIMESTAMPTZ資料。在向TIMESTAMPTZ欄位插入值的時候, Hologres會自動將用戶端時區的值轉換成UTC時區,在展示查詢結果的時候,根據用戶端TimeZone配置參數聲明的時區轉換為用戶端時間。 |
毫秒 |
2022-02-01 10:33:20.125+08 |
查看預設的時區
-
查看當前用戶端的時區。
show timezone;說明-
在Holoweb中執行的結果為執行個體的預設時區(PRC)對應東八區。
-
如果使用其他開發工具,查詢結果不是預設時區,則說明更改過用戶端時區配置。
-
-
通過查詢系統資料表查看每個地區對應的時區。
在Postgres中通過系統資料表pg_timezone_names儲存不同地區的預設時區資訊,可以通過如下命令查詢系統資料表查看每個地區對應的時區。
select * from pg_timezone_names;系統資料表參數說明如下。
參數
類型
描述
name
text
時區名稱。
abbrev
text
時區縮寫。
utc_offset
interval
UTC位移時區,正數(+)表示格林威治以東,負數(-)表示格林威治以西。
is_dst
boolean
如果當前正在觀察夏令時,則為真(t),否則為否(f)。
修改用戶端時區
-
Hologres中允許使用以下幾種形式指定時區。
-
完整的時區名稱:例如America/New_York。
-
UTC時區的位移:例如-08:00:00或UTC-08表示東八區,由於遵循POSIX時區規範,在使用GMT或UTC表示時區時,其位移量符號與上述符號相反,因此負號(-)表示東時區。
-
Hologres中的常用時區及其對應參數值如下所示。
|
地區 |
時區 |
完整時區名 |
UTC時區的位移 |
|
東八區 |
|
UTC-08 |
|
日本(東京) |
東九區 |
Asia/Tokyo |
UTC-09 |
|
印尼(雅加達) |
東七區 |
Asia/Jakarta |
UTC-07 |
|
德國(法蘭克福) |
東一區 |
Europe/Berlin |
UTC-01 |
|
美國(維吉尼亞) |
西五區 |
|
UTC+05 |
|
美國(矽谷) |
西八區 |
|
UTC+08 |
-
修改用戶端時區
Hologres的時區預設按照UTC儲存,所有Region預設為
UTC-08(中國東八區)。可以通過修改用戶端時區參數達到用戶端顯示不同時區的目的。通過以下命令進行修改用戶端顯示時區。說明修改時區是修改用戶端展示時區,並不是修改底層儲存的真即時區資訊。
-
Session層級
通過set命令可以在Session層級設定GUC參數。Session層級的參數只在當前Session生效,當串連斷開之後將會失效,建議加在SQL前一起執行,使用方法如下。
--修改為加拿大/東部時區 set timezone ='Canada/Eastern'; --修改為西五區 set timezone ='05:30:00'; -
資料庫層級
可以通過
alter database <db_name> set <value>;命令來DB層級設定GUC參數。說明此命令執行完成後:
-
在整個資料庫層級生效,設定完成後當前串連需要重新中斷連線才會生效。
-
建立資料庫不會生效,需要重新手動設定。
使用方法如下。
--DB層級修改時區為'UTC'零時區 alter database <db_name> set timezone = 'UTC-0'; --DB層級修改時區為'UTC'西五時區 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 Connector在寫入過程中會自動將資料時區變為零時區,因此在Hologres中映射為TIMESTAMPTZ類型。 |
常見問題
-
DataHub即時同步資料至Hologres,Hologres的欄位類型為TIMESTAMP,DataHub欄位類型為TIMESTAMP,寫入後Hologres中時間比實際少八個小時。
-
可能原因:Hologres Connector在寫入過程中,會自動將資料時區變為零時區。如果Hologres欄位設定為TIMESTAMP,不會帶時區,寫入後還是零時區,因此會少八個小時。
-
解決方案:重建立表,將Hologres中的欄位改成TIMESTAMPTZ。
-
-
DataHub即時同步資料至Hologres,Hologres的欄位類型為TIMESTAMPTZ,Tableau展示的時候與Hologres的時間差八個小時。
-
可能原因:Tableau前端時區展示問題。
-
解決方案:HoloWeb的時區預設為UTC-08(東八區),可以通過HoloWeb查看是否符合真實資料,然後在Tableau建立串連的時候,可以在Initial SQL(初始 SQL)裡修改時區,命令樣本如下。
--修改為按照東八區顯示 set timezone to 'Asia/Shanghai';
-
-
MySQL資料同步到Hologres後時間顯示為什麼會出現
+08?-
可能原因:
+08代表的是當前用戶端展示的是東八區時區,並不是資料是東八區。 -
解決方案:通過修改用戶端時區為指定的時區。
-
-
JDBC裡面如何設定時區?
JDBC的時區顯示預設同JVM時區,如果需要修改JDBC的時區顯示,需要串連JDBC後,執行以下SQL進行修改。
-- 修改為東七區 set timezone = '+07';