作为对Elliott答案的补充,我想测试一下时区数学是否能够处理夏令时变化:
#standardSQL
WITH dates AS (
SELECT TIMESTAMP('2015-07-01') x, 'summer' season
UNION ALL SELECT TIMESTAMP('2015-01-01') x, 'winter' season
)
SELECT
season,
time_zone,
DATETIME_DIFF(DATETIME(x, time_zone),
DATETIME(x), HOUR) AS hours_from_utc
FROM UNNEST(['America/Los_Angeles', 'America/New_York']) AS time_zone
CROSS JOIN dates
ORDER BY 1,2
它的功能包括:
+
| season | time_zone | hours_from_utc |
+
| summer | America/Los_Angeles | -7 |
| summer | America/New_York | -4 |
| winter | America/Los_Angeles | -8 |
| winter | America/New_York | -5 |
+
它甚至知道智利在2015年没有经历夏令时:
#standardSQL
WITH dates AS (
SELECT TIMESTAMP('2014-07-01') x
UNION ALL SELECT TIMESTAMP('2015-07-01') x
UNION ALL SELECT TIMESTAMP('2016-07-01') x
)
SELECT
EXTRACT(YEAR FROM x),
time_zone,
DATETIME_DIFF(DATETIME(x, time_zone),
DATETIME(x), HOUR) AS hours_from_utc
FROM UNNEST(['Chile/Continental', 'America/New_York']) AS time_zone
CROSS JOIN dates
ORDER BY 2,2
+
| f0_ | time_zone | hours_from_utc |
+
| 2014 | America/New_York | -4 |
| 2015 | America/New_York | -4 |
| 2016 | America/New_York | -4 |
| 2014 | Chile/Continental | -4 |
| 2015 | Chile/Continental | -3 |
| 2016 | Chile/Continental | -4 |
+
format_timestamp
函数可以返回一个字符串并处理时区 - https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#format_timestamp - Graham Polley