

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://www.amazonaws.cn/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# CONVERT\$1TIMEZONE 函数
<a name="CONVERT_TIMEZONE"></a>

CONVERT\$1TIMEZONE 将一个时区的时间戳转换为另一个时区的时间戳。该函数会自动根据夏令时调整。

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

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

## 参数
<a name="CONVERT_TIMEZONE-arguments"></a>

*source\$1timezone*  
（可选）当前时间戳的时区。默认值为 UTC。有关更多信息，请参阅 [时区使用说明](#CONVERT_TIMEZONE-usage-notes)。

*target\$1timezone*   
新时间戳的时区。有关更多信息，请参阅 [时区使用说明](#CONVERT_TIMEZONE-usage-notes)。

*timestamp*   
时间戳列或隐式转换为时间戳的表达式。

## 返回类型
<a name="CONVERT_TIMEZONE-return-type"></a>

TIMESTAMP

## 时区使用说明
<a name="CONVERT_TIMEZONE-usage-notes"></a>

可指定 *source\$1timezone* 或 *target\$1timezone* 作为时区名称（如“非洲/坎帕拉”或“新加坡”）或作为时区缩写（如“UTC”或“PDT”）。您不必将时区名称转换为其他名称，也不必将缩写转换为其他缩写。例如，您可以从源时区名称“新加坡”中选择一个时间戳，然后将其转换为时区缩写“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\$1TIMEZONE 函数将它们视为时区名称，而不是时区缩写。

如果您使用时区名称指定时区，CONVERT\$1TIMEZONE 会根据夏令时（DST）或在 *timestamp* 指定的日期和时间期间为该时区实行的任何其他当地季节性协议，如夏令时、标准时间或冬令时，自动进行调整。例如，“欧洲/伦敦”在冬季表示 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\$1TIMEZONE 将使用与 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.amazonaws.cn/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 时区转换为美国/太平洋时区。目标时区使用时区名称，时间戳位于夏令时间段内，因此函数返回夏令时。

```
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\$1York)，并且时间戳在标准时间段内。

```
select convert_timezone('America/New_York', '2013-02-01 08:00:00');

 convert_timezone
---------------------
2013-02-01 03:00:00
(1 row)
```

以下示例将时间戳转换为美国东部夏令时，因为目标时区使用时区名称 (America/New\$1York)，并且时间戳在夏令时时间段内。

```
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)
```