dna*_*eye 3 sql google-bigquery
我已经多次梳理了 Google 的文档,但似乎找不到一个简单的函数(在SELECT查询中)将 UTC 时间戳转换为不同的时区,在我的情况下是太平洋。对于大多数国际时区,我可以简单地使用TIMESTAMP_SUB或TIMESTAMP_ADD减去/添加偏移时间,但美国使用夏令时会使事情复杂化(不必要!)。
我错过了文档中的某些内容吗?或者有没有其他方法可以轻松转换到另一个时区?
该TIMESTAMP类型与 UTC 相关联。当转换TIMESTAMP到不依赖于特定的时区一些其他类型,如STRING,DATE或者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 相关联,尽管被该时间与太平洋时间之间的当前差异所抵消。