我正在 GBQ 中创建一个表,其过期时间戳如下:
CREATE OR REPLACE TABLE
`myproject.mydataset.testtable`
OPTIONS (expiration_timestamp=TIMESTAMP(DATE_ADD(CURRENT_DATE(), INTERVAL 2 DAY)))
AS
SELECT
1 AS column_one
结果表的到期时间是世界标准时间上午 7 点,但是
SELECT TIMESTAMP(DATE_ADD(CURRENT_DATE(), INTERVAL 2 DAY)
的输出是午夜(世界标准时间)。
有人能解释一下我在这里缺少什么信息吗?
根据文档,所有这些日期(时间)相关函数的默认时区是 UTC。
实际上,人们会期望此处将到期时间设置为 UTC 午夜 - 并与直接查询表达式的结果相匹配。但是,GCP 似乎在处理请求时在内部计算过期时间,因此在处理请求的时区中。
可以验证:
SELECT
TIMESTAMP(DATE_ADD(CURRENT_DATE(), INTERVAL 2 DAY)),
DATE_ADD(DATE("2024-07-06", "US/Pacific"), INTERVAL 2 DAY),
TIMESTAMP(DATE_ADD(CURRENT_DATE(), INTERVAL 2 DAY), "US/Pacific"),
TIMESTAMP(DATE_ADD(CURRENT_DATE("UTC"), INTERVAL 2 DAY), "US/Pacific"),
TIMESTAMP(DATE_ADD(CURRENT_DATE("UTC"), INTERVAL 2 DAY), "UTC"),
TIMESTAMP(DATE_ADD(CURRENT_DATE("US/Pacific"), INTERVAL 2 DAY), "US/Pacific")
使用这个可以认识到,显然在内部,查询选项的计算(与查询本身相反)是在美国/太平洋时间运行的。
这是 GCP 端的一个错误。
一般来说,这里对隐式时区的依赖以及对时间戳的强制似乎导致了问题。
对于我们的案例,我们通过切换到时间相关设置来确保满足期望:
TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 36 HOUR))