- 类别:
CONVERT_TIMEZONE¶
将时间戳转换为另一个时区。
语法¶
CONVERT_TIMEZONE( <source_tz> , <target_tz> , <source_timestamp_ntz> )
CONVERT_TIMEZONE( <target_tz> , <source_timestamp> )
实参¶
source_tz
该字符串指定输入时间戳的时区。对于没有时区的时间戳(即 TIMESTAMP_NTZ),必须使用此字符串。
target_tz
该字符串指定输入时间戳应转换为的时区。
source_timestamp_ntz
对于 3 实参版本,该字符串指定要转换的时间戳(必须是 TIMESTAMP_NTZ)。
source_timestamp
对于 2 实参版本,该字符串指定要转换的时间戳(可以是任何时间戳变体,包括 TIMESTAMP_NTZ)。
返回¶
返回 TIMESTAMP_NTZ、TIMESTAMP_TZ 或 NULL 类型的值。
对于 3 参数版本,返回类型为 TIMESTAMP_NTZ 的值。
对于 2 参数版本,返回类型为 TIMESTAMP_TZ 的值。
如果任何实参为 NULL,则返回 NULL。
使用说明¶
输出中时间戳的显示格式由当前会话的 时间戳输出格式 和返回的时间戳值的数据类型决定。
对于 3 实参版本,结果中的“挂钟”时间表示与输入时区中的输入“挂钟”相同的时间点,但位于目标时区。
对于 2 实参版本,
source_timestamp
实参通常包括时区。如果值为类型 TIMESTAMP_TZ,则从其值中获取时区。否则,使用当前会话时区。对于
source_tz
和target_tz
,可以指定 时区名称 (https://data.iana.org/time-zones/tzdb-2021a/zone1970.tab) 或 IANA 时区数据库 (https://data.iana.org/time-zones/tzdb-2021a/backward) 版本 2021a 中的链接名称`_(例如,:code:`America/Los_Angeles
、Europe/London
、UTC
、Etc/GMT
等)。备注
时区名称区分大小写,必须 放在单引号内(例如
'UTC'
)。Snowflake 不支持 大多数时区 缩写 (link removed) (例如,
PDT
、EST
等),因为给定的缩写可能指几个不同的时区之一。例如,CST
可能指北美中部标准时间 (UTC-6)、古巴标准时间 (UTC-5) 和中国标准时间 (UTC+8)。
示例¶
要对示例中返回的时间戳使用默认 时间戳输出格式,请在当前会话中取消设置 TIMESTAMP_OUTPUT_FORMAT 参数:
ALTER SESSION UNSET TIMESTAMP_OUTPUT_FORMAT;
指定了源时区的示例¶
以下示例使用 CONVERT_TIMEZONE 函数的 3 实参版本,并指定 source_tz
值。这些示例返回 TIMESTAMP_NTZ 值。
将洛杉矶的“挂钟”时间转换为匹配的纽约“挂钟”时间:
SELECT CONVERT_TIMEZONE(
'America/Los_Angeles',
'America/New_York',
'2024-01-01 14:00:00'::TIMESTAMP_NTZ
) AS conv;
+-------------------------+
| CONV |
|-------------------------|
| 2024-01-01 17:00:00.000 |
+-------------------------+
将华沙的“挂钟”时间转换为匹配的 UTC“挂钟”时间:
SELECT CONVERT_TIMEZONE(
'Europe/Warsaw',
'UTC',
'2024-01-01 00:00:00'::TIMESTAMP_NTZ
) AS conv;
+-------------------------+
| CONV |
|-------------------------|
| 2023-12-31 23:00:00.000 |
+-------------------------+
未指定源时区的示例¶
以下示例使用 CONVERT_TIMEZONE 函数的 2 实参版本。这些示例返回 TIMESTAMP_TZ 值。因此,返回的值包括一个偏移量,其显示时间戳的时区和协调世界时 (UTC) 之间的时差。例如,America/Los_Angeles
时区有一个 -0700
时差,以显示它比 UTC 晚 7 小时。
将指定 TIMESTAMP_TZ 值的字符串转换为不同的时区:
SELECT CONVERT_TIMEZONE(
'America/Los_Angeles',
'2024-04-05 12:00:00 +02:00'
) AS time_in_la;
+-------------------------------+
| TIME_IN_LA |
|-------------------------------|
| 2024-04-05 03:00:00.000 -0700 |
+-------------------------------+
显示不同时区的当前“挂钟”时间:
SELECT
CURRENT_TIMESTAMP() AS now_in_la,
CONVERT_TIMEZONE('America/New_York', CURRENT_TIMESTAMP()) AS now_in_nyc,
CONVERT_TIMEZONE('Europe/Paris', CURRENT_TIMESTAMP()) AS now_in_paris,
CONVERT_TIMEZONE('Asia/Tokyo', CURRENT_TIMESTAMP()) AS now_in_tokyo;
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
| NOW_IN_LA | NOW_IN_NYC | NOW_IN_PARIS | NOW_IN_TOKYO |
|-------------------------------+-------------------------------+-------------------------------+-------------------------------|
| 2024-06-12 08:52:53.114 -0700 | 2024-06-12 11:52:53.114 -0400 | 2024-06-12 17:52:53.114 +0200 | 2024-06-13 00:52:53.114 +0900 |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+