创建带有过期选项的bigquery表会导致意外的过期时间

问题描述 投票:0回答:1

我正在 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)
的输出是午夜(世界标准时间)。

有人能解释一下我在这里缺少什么信息吗?

google-bigquery timezone
1个回答
0
投票

根据文档,所有这些日期(时间)相关函数的默认时区是 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))
© www.soinside.com 2019 - 2024. All rights reserved.