CONVERT_TIMEZONE 函数 - Amazon Redshift

CONVERT_TIMEZONE 函数

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

语法

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

参数

source_timezone

(可选)当前时间戳的时区。默认值为 UTC。有关更多信息,请参阅 时区使用说明

target_timezone

新时间戳的时区。有关更多信息,请参阅 时区使用说明

timestamp

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

返回类型

TIMESTAMP

时区使用说明

可指定 source_timezonetarget_timezone 作为时区名称(如“非洲/坎帕拉”或“新加坡”)或作为时区缩写(如“UTC”或“PDT”)。您不必将时区名称转换为其他名称,也不必将缩写转换为其他缩写。例如,您可以从源时区名称“新加坡”中选择一个时间戳,然后将其转换为时区缩写“PDT”中的时间戳。

注意

使用时区名称或时区缩写的结果可能会因当地季节性时间(如夏令时)而有所不同。

使用时区名称

要查看当前的完整时区名称列表,请运行以下命令。

select pg_timezone_names();

每行包含一个以逗号分隔的字符串,其中包含时区名称、缩写、UTC 偏移量以及用于指示时区是否遵守夏令时的指示符(tf)。例如,以下代码段显示了两个生成的行。第一行是时区 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_TIMEZONE 会根据夏令时(DST)或在 timestamp 指定的日期和时间期间为该时区实行的任何其他当地季节性协议,如夏令时、标准时间或冬令时,自动进行调整。例如,“欧洲/伦敦”在冬季表示 UTC,在夏季加一小时。

使用时区缩写

要查看当前的完整时区缩写列表,请运行以下命令。

select pg_timezone_abbrevs();

结果包含一个以逗号分隔的字符串,其中包含时区缩写、UTC 偏移量以及用于指示时区是否遵守夏令时的指示符(tf)。例如,以下代码段显示了两个生成的行。第一行包含太平洋夏令时的缩写 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 样式格式

POSIX 样式的时区规范采用 STDoffsetSTDoffsetDST 的形式,其中 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 时区转换为美国/太平洋时区。目标时区使用时区名称,时间戳位于夏令时间段内,因此函数返回夏令时。

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)