在 BigQuery 中将时间戳转换为不同的时区

dna*_*eye 3 sql google-bigquery

我已经多次梳理了 Google 的文档,但似乎找不到一个简单的函数(在SELECT查询中)将 UTC 时间戳转换为不同的时区,在我的情况下是太平洋。对于大多数国际时区,我可以简单地使用TIMESTAMP_SUBTIMESTAMP_ADD减去/添加偏移时间,但美国使用夏令时会使事情复杂化(不必要!)。

我错过了文档中的某些内容吗?或者有没有其他方法可以轻松转换到另一个时区?

Ell*_*ard 5

TIMESTAMP类型与 UTC 相关联。当转换TIMESTAMP到不依赖于特定的时区一些其他类型,如STRINGDATE或者DATETIME,你可以指定转换,如时区:

SELECT EXTRACT(DATE FROM CURRENT_TIMESTAMP()
               AT TIME ZONE 'America/Los_Angeles') AS current_pst_day;
Run Code Online (Sandbox Code Playgroud)

如果您想要不同时区之间的(当前)小时数,您可以使用CURRENT_DATETIME()不同的时区并取差异:

SELECT
  time_zone,
  DATETIME_DIFF(CURRENT_DATETIME(time_zone),
                CURRENT_DATETIME(), HOUR) AS hours_from_utc
FROM UNNEST(['America/Los_Angeles', 'America/New_York']) AS time_zone;
+---------------------+----------------+
| time_zone           | hours_from_utc |
+---------------------+----------------+
| America/Los_Angeles | -8             |
| America/New_York    | -5             |
+---------------------+----------------+
Run Code Online (Sandbox Code Playgroud)

为了使偏移更方便,您可以将其包装到 SQL 函数中,然后调用它以将偏移添加到特定时间戳:

CREATE TEMP FUNCTION OffsetForTimeZone(t TIMESTAMP, time_zone STRING) AS (
  TIMESTAMP_ADD(t, INTERVAL DATETIME_DIFF(CURRENT_DATETIME(time_zone),
                                          CURRENT_DATETIME(), HOUR) HOUR)
);

SELECT OffsetForTimeZone(CURRENT_TIMESTAMP(), 'America/Los_Angeles');
Run Code Online (Sandbox Code Playgroud)

请记住,此结果仍然TIMESTAMP与 UTC 相关联,尽管被该时间与太平洋时间之间的当前差异所抵消。