类别:

日期和时间函数

CONVERT_TIMEZONE

将时间戳转换为另一个时区。

语法

CONVERT_TIMEZONE( <source_tz> , <target_tz> , <source_timestamp_ntz> )

CONVERT_TIMEZONE( <target_tz> , <source_timestamp> )
Copy

实参

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_tztarget_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_AngelesEurope/LondonUTCEtc/GMT 等)。

    备注

    • 时区名称区分大小写,必须 放在单引号内(例如 'UTC')。

    • Snowflake 不支持 大多数时区 缩写 (link removed) (例如,PDTEST 等),因为给定的缩写可能指几个不同的时区之一。例如,CST 可能指北美中部标准时间 (UTC-6)、古巴标准时间 (UTC-5) 和中国标准时间 (UTC+8)。

示例

要对示例中返回的时间戳使用默认 时间戳输出格式,请在当前会话中取消设置 TIMESTAMP_OUTPUT_FORMAT 参数:

ALTER SESSION UNSET TIMESTAMP_OUTPUT_FORMAT;
Copy

指定了源时区的示例

以下示例使用 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;
Copy
+-------------------------+
| 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;
Copy
+-------------------------+
| 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;
Copy
+-------------------------------+
| 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;
Copy
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
| 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 |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
语言: 中文