

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。如需詳細資訊，請參閱[部落格文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# CONVERT\_TIMEZONE 函數
<a name="CONVERT_TIMEZONE"></a>

CONVERT\_TIMEZONE 可將時間戳記從一個時區轉換為另一個時區。此函式會根據日光節約時間自動調整。

## 語法
<a name="CONVERT_TIMEZONE-syntax"></a>

```
CONVERT_TIMEZONE( ['source_timezone',] 'target_timezone', 'timestamp')
```

## 引數
<a name="CONVERT_TIMEZONE-arguments"></a>

*source\_timezone*  
(選用) 目前時間戳記的時區。預設值為 UTC。如需詳細資訊，請參閱[時區使用須知](#CONVERT_TIMEZONE-usage-notes)。

*target\_timezone*   
新時間戳記的時區。如需詳細資訊，請參閱[時區使用須知](#CONVERT_TIMEZONE-usage-notes)。

*timestamp*   
時間戳記欄或運算式會隱性轉換為時間戳記。

## 傳回類型
<a name="CONVERT_TIMEZONE-return-type"></a>

TIMESTAMP

## 時區使用須知
<a name="CONVERT_TIMEZONE-usage-notes"></a>

您可以將 *source\_timezone* 或 *target\_timezone* 指定為時區名稱 (例如 'Africa/Kampala' 或 'Singapore') 或做為時區縮寫 (例如 'UTC' 或 'PDT')。您不需要將時區名稱轉換為名稱，或將縮寫轉換為縮寫。例如，您可以從來源時區名稱 'Singapore' 選擇時間戳記，並將其轉換為時區縮寫 'PDT' 的時間戳記。

**注意**  
使用時區名稱或時區縮寫時，可能會因為當地季節性時間而有不同結果，例如日光節約時間。

### 使用時區名稱
<a name="CONVERT_TIMEZONE-using-name"></a>

若要查看最新且完整的時區名稱清單，請執行下列命令。

```
select pg_timezone_names();
```

每一列都包含一個逗號分隔的字串，其中包含時區名稱、縮寫、UTC 時差，以及時區是否會遵循日光節約時間 (`t` 或 `f`) 的指標。以下列程式碼片段為例，其將顯示兩個產生的資料列。第一列是時區 `Antarctica/South Pole`、縮寫 `NZDT` (與 UTC 的時差為 `13:00:00`)，以及 `f`，用於表示其不會遵循日光節約時間。第二列是時區 `Europe/Paris`、縮寫 `CET` (與 UTC 的時差為 `01:00:00`)，以及 `f`，用於表示其不會遵循日光節約時間。

```
pg_timezone_names
------------------
(Antarctica/South_Pole,NZDT,13:00:00,t)	
(Europe/Paris,CET,01:00:00,f)
```

執行 SQL 陳述式以取得整個清單並尋找時區名稱。大約會傳回 600 個資料列。雖然部分傳回的時區名稱為大寫首字母或縮寫 (例如，GB、PRC、ROK)，CONVERT\_TIMEZONE 功能仍會將其視為時區名稱，而非時區縮寫。

如果您使用時區名稱指定時區，CONVERT\_TIMEZONE 會為日光節約時間 (DST)，或在由 '*timestamp*' 指定的日期和時間期間為該時區強制執行的任何當地季節協定 (例如夏天時間、標準時間或冬天時間) 自動調整。例如，'Europe/London' 在冬天代表 UTC，在夏天增加一小時。請注意，Amazon Redshift 使用 [IANA 時區資料庫](https://www.iana.org/time-zones)作為時區規格的授權來源。

### 使用時區縮寫
<a name="CONVERT_TIMEZONE-using-abbrev"></a>

 若要查看最新且完整的時區縮寫清單，請執行下列命令。

```
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\_TIMEZONE 會使用與 UTC 固定的偏差且不會為任何當地季節協定進行調整。

### 使用 POSIX 樣式格式
<a name="CONVERT_TIMEZONE-using-posix"></a>

POSIX 樣式時區規格的格式是 *STDoffset* 或 *STDoffsetDST*，其中 *STD* 是時區縮寫，*offset* 是 UTC 以西的小時偏移量，*DST* 是選用的日光節約時區縮寫。日光節約時間假設為比所指時差早一小時。

POSIX 樣式時區格式使用格林威治以西的正偏移，與 ISO-8601 慣例不同，此是使用格林威治以東的正偏移。

以下是 POSIX 樣式時區的範例：
+  PST8
+  PST8PDT
+  EST5
+  EST5EDT

**注意**  
Amazon Redshift 不會驗證 POSIX 樣式時區規格，所以可能會將時區設為無效值。例如，即使將時區設為無效值，下列命令不會傳回錯誤。  

```
set timezone to ‘xxx36’;
```

## 範例
<a name="CONVERT_TIMEZONE-examples"></a>

許多範例都使用 TICKIT 範例資料集。如需詳細資訊， 請參閱[範本資料庫](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html)。

以下範例會將時間戳記值從預設 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)
```