本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
CONVERT_TIMEZONE 函數
CONVERT_TIMEZONE 可將時間戳記從一個時區轉換為另一個時區。此功能會根據日光節約時間自動調整。
語法
CONVERT_TIMEZONE( ['source_timezone',] 'target_timezone', 'timestamp')
引數
- timestamp
-
時間戳記欄或運算式會隱性轉換為時間戳記。
傳回類型
TIMESTAMP
時區使用須知
來源時區或 target_ 時區/時區可以指定為時區名稱(例如「非洲/坎帕拉」或「新加坡」),也可以指定為時區縮寫(例如「世界標準時間」或「PDT」)。您不必將時區名稱轉換為名稱或縮寫轉換為縮寫。例如,您可以從來源時區名稱「Singapore」中選擇時間戳記,並將其轉換為時區縮寫「PDT」的時間戳記。
注意
使用時區名稱或時區縮寫的結果可能會因當地季節時間 (例如夏令時間) 而有所不同。
使用時區名稱
若要檢視目前和完整的時區名稱清單,請執行下列命令。
select pg_timezone_names();
每一個資料列都包含一個逗號分隔的字串,其中包含時區名稱、縮寫、UTC 時差,以及時區是否會遵循日光節約時間 (t
或 f
) 的指標。以下列程式碼片段為例,其將顯示兩個產生的資料列。第一行是時區Europe/Paris
,縮寫CET
,與 UTC 的01:00:00
偏移量,並f
表示它不會觀察日光節約時間。第二行是時區Israel
,縮寫IST
,與 UTC 02:00:00
偏移量,並f
表示它不會觀察日光節約時間。
pg_timezone_names
-----------------
(Europe/Paris,CET,01:00:00,f)
(Israel,IST,02:00:00,f)
執行 SQL 陳述式以取得整個清單並尋找時區名稱。大約會傳回 600 個資料列。雖然部分傳回的時區名稱為大寫首字母或縮寫 (例如,GB、PRC、ROK),CONVERT_TIMEZONE 功能仍會將其視為時區名稱,而非時區縮寫。
如果您使用時區名稱指定時區,CONVERT_TIMZONE 會自動調整夏令時 (DST) 或任何其他本地季節性協定,例如夏令時間、標準時間或冬令時間,這些時區在「timestamp」指定的日期和時間內生效。例如,'Europe/London' 在冬天代表 UTC,在夏天增加一小時。
使用時區縮寫
若要檢視目前和完整的時區縮寫清單,請執行下列命令。
select pg_timezone_abbrevs();
結果都會包含一個逗號分隔的字串,其中包含時區縮寫、UTC 時差,以及時區是否會遵循日光節約時間的指標 (t
或 f
)。以下列程式碼片段為例,其將顯示兩個產生的資料列。第一列包含太平洋夏令時間的縮寫 (PDT
),與 UTC 的時差為 -07:00:00
,以及表示其遵循日光節約時間的 t
。第二列包含太平洋標準時間的縮寫PST
,與 UTC 的-08:00:00
偏移量,並表示它不會觀察f
到節省日光的時間。
pg_timezone_abbrevs
--------------------
(PDT,-07:00:00,t)
(PST,-08:00:00,f)
執行 SQL 陳述式以取得整個清單,並根據其時差和日光節約時間指標來尋找縮寫。大約會傳回 200 個資料列。
時區縮寫代表與 UTC 的固定偏差。如果您使用時區縮寫指定時區,CONVERT_TIMZONE 會使用與 UTC 相比的固定偏移量,並且不會針對任何本地季節性通訊協定進行調整。
使用 POSIX 樣式格式
POSIX 樣式時區規格的格式是 STDoffset 或 STDoffsetDST,其中 STD 是時區縮寫,offset 是 UTC 以西的小時偏移量,DST 是選用的日光節約時區縮寫。日光節約時間假設為較給定偏移早一小時。
POSIX 樣式時區格式使用格林威治以西的正偏移,與 ISO-8601 慣例不同,此是使用格林威治以東的正偏移。
以下是 POSIX 樣式時區的範例:
-
PST8
-
PST8PDT
-
EST5
-
EST5EDT
注意
Amazon Redshift 不會驗證 POSIX 樣式時區規格,所以可能會將時區設為無效值。例如,即使將時區設為無效值,下列命令不會傳回錯誤。
set timezone to ‘xxx36’;
範例
許多範例都使用 TICKIT 範例資料集。如需詳細資訊, 請參閱範本資料庫。
以下範例會將時間戳記值從預設 UTC 時區轉換為 PST。
select convert_timezone('PST', '2008-08-21 07:23:54');
convert_timezone ------------------------ 2008-08-20 23:23:54
以下範例會將 LISTTIME 欄位中的時間戳記值從預設 UTC 時區轉換為 PST。即使時間戳記是在日光節約時間期間,其會轉換為標準時間,因為目標時區是指定為縮寫 (PST)。
select listtime, convert_timezone('PST', listtime) from listing where listid = 16;
listtime | convert_timezone --------------------+------------------- 2008-08-24 09:36:12 2008-08-24 01:36:12
以下範例會將時間戳記 LISTTIME 欄位從預設 UTC 時區轉換為 US/Pacific 時區。目標時區使用時區名稱,且時間戳記是在日光節約時間期間,因此函數會傳回日光時間。
select listtime, convert_timezone('US/Pacific', listtime) from listing where listid = 16;
listtime | convert_timezone --------------------+--------------------- 2008-08-24 09:36:12 | 2008-08-24 02:36:12
以下範例會將時間戳記字串從 EST 轉換為 PST:
select convert_timezone('EST', 'PST', '20080305 12:25:29');
convert_timezone ------------------- 2008-03-05 09:25:29
以下範例會將時間戳記轉換為美國東部標準時間,因為目標時區使用時區名稱 (America/New_York) 且時間戳記是在標準時間期間。
select convert_timezone('America/New_York', '2013-02-01 08:00:00');
convert_timezone --------------------- 2013-02-01 03:00:00 (1 row)
以下範例會將時間戳記轉換為美國東部日光時間,因為目標時區使用時區名稱 (America/New_York) 且時間戳記是在日光時間期間。
select convert_timezone('America/New_York', '2013-06-01 08:00:00');
convert_timezone --------------------- 2013-06-01 04:00:00 (1 row)
以下範例示範的是偏移的使用。
SELECT CONVERT_TIMEZONE('GMT','NEWZONE +2','2014-05-17 12:00:00') as newzone_plus_2, CONVERT_TIMEZONE('GMT','NEWZONE-2:15','2014-05-17 12:00:00') as newzone_minus_2_15, CONVERT_TIMEZONE('GMT','America/Los_Angeles+2','2014-05-17 12:00:00') as la_plus_2, CONVERT_TIMEZONE('GMT','GMT+2','2014-05-17 12:00:00') as gmt_plus_2;
newzone_plus_2 | newzone_minus_2_15 | la_plus_2 | gmt_plus_2 ---------------------+---------------------+---------------------+--------------------- 2014-05-17 10:00:00 | 2014-05-17 14:15:00 | 2014-05-17 10:00:00 | 2014-05-17 10:00:00 (1 row)