致那些在这里绊倒的人:
如何将时间戳转换为另一个时区?
鉴于 TIMESTAMP 值一旦构造为 stored as UTC,并且 TIMESTAMP 没有构造函数 (TIMESTAMP, STRING),您可以先将时间戳转换为另一个时区,方法是先将其转换为 DATETIME,然后再构造新时区中 DATETIME 的新 TIMESTAMP:
SELECT TIMESTAMP(DATETIME(timestamp_field, '{timezone}'))
例子:
SELECT
input_tz,
input,
'America/Montreal' AS output_tz,
TIMESTAMP(DATETIME(input,'America/Montreal')) AS output
FROM (
SELECT 'US/Pacific' AS input_tz, TIMESTAMP(DATETIME(DATE(2021, 1, 1), TIME(16, 0, 0)), 'US/Pacific') AS input
UNION ALL
SELECT 'UTC' AS input_tz, TIMESTAMP(DATETIME(DATE(2021, 1, 1), TIME(16, 0, 0)), 'UTC') AS input
UNION ALL
SELECT 'Europe/Berlin' AS input_tz, TIMESTAMP(DATETIME(DATE(2021, 1, 1), TIME(16, 0, 0)), 'Europe/Berlin') AS input
) t
结果:
| Row |
input_tz |
input |
output_tz |
output |
| 1 |
US/Pacific |
2021-01-02 00:00:00 UTC |
America/Montreal |
2021-01-01 19:00:00 UTC |
| 2 |
UTC |
2021-01-01 16:00:00 UTC |
America/Montreal |
2021-01-01 11:00:00 UTC |
| 3 |
Europe/Berlin |
2021-01-01 15:00:00 UTC |
America/Montreal |
2021-01-0110:00:00 UTC |
如何从 DATETIME 值中去除时区信息?
BigQuery 中的 DATETIME 是简单的时区,因此它们不包含时区信息。话虽这么说,如果您拥有可以知道 DATETIME 的时区的业务知识,则可以通过将其转换为具有已知时区的 TIMESTAMP 来去除该时区偏移:
SELECT TIMESTAMP(datetime_value, '{timezone}')
鉴于 TIMESTAMP 以 UTC 存储值,如果这是您首选的存储方法,您可以重新转换为 DATETIME,但现在您会知道您的 DATETIME 是 UTC :)
希望这会有所帮助! :)