BigQuery 自动将时间戳时区转换为 UTC

Posted

技术标签:

【中文标题】BigQuery 自动将时间戳时区转换为 UTC【英文标题】:BigQuery automatically converts timestamp timezone to UTC 【发布时间】:2018-06-02 14:46:18 【问题描述】:

我有一张这样的桌子:

还有一个文件:https://storage.googleapis.com/test_share_file/testTimestamp.csv

看起来像:

我使用 python 将文件加载到大查询中:

from google.cloud import bigquery as bq

gs_path = 'gs://test_share_file/testTimestamp.csv'
bq_client = bq.Client.from_service_account_json(gcp_creds_fp)
ds = bq_client.dataset('test1')
tbl = ds.table('testTimestamp')

job_config = bq.LoadJobConfig()
job_config.write_disposition = bq.job.WriteDisposition.WRITE_APPEND
job_config.skip_leading_rows = 1 # skip header
load_job = bq_client.load_table_from_uri(gs_path, tbl, job_config=job_config)
res = load_job.result()

然而在表格中,两个时间戳都是 UTC 时间!

如何让第二列在东部时间?

【问题讨论】:

【参考方案1】:

您可以即时将第一列“转换”为东部时间 - 如下例所示

#standardSQL
WITH t AS (
  SELECT TIMESTAMP '2018-05-07 22:40:00+00:00' AS ts
)
SELECT ts, STRING(ts, '-04:00') timestamp_eastern
FROM t

我正在处理......固执......

您可以创建包含您需要的所有逻辑的视图,以便客户端将查询该视图而不是原始表

#standardSQL
CREATE VIEW `project.dataset.your_view` AS 
SELECT ts, STRING(ts, '-04:00') timestamp_eastern 
FROM `project.dataset.your_table`

我确实认为大型查询无法在时区显示时间很奇怪

时间戳代表一个绝对时间点,独立于任何时区或惯例,例如夏令时。 解析时间戳或格式化时间戳以进行显示时使用时区。时间戳值本身不存储特定的时区。字符串格式的时间戳可能包括时区。如果没有明确指定时区,则使用默认时区 UTC。

查看更多关于Timestamp type

【讨论】:

大查询是否不能有列在UTC以外的时区? @RSHAP - 我支持 Elliott,这就是为什么我认为我的回答仍然是你要走的路。从client ... does not know sql 开始 - 你应该付出一些额外的努力来教/教育客户至少有一些基础知识,否则你以后无论如何都会遇到问题。现在不懂 Sql 就像完全不懂基本英语一样。所以如果这个客户对你很重要 - 让它发生:o) @RSHAP - 明白。如果您可以提供有关您的特定用例的更多详细信息,我们都会一次又一次地面临这种情况(客户的固执)-我们也许可以提供更多帮助。主要是 - 如果您的客户不愿意学习 sql,他们希望如何使用/消费数据?等同时,请参阅我在答案中添加的更新 -04:00 是与 UTC 的偏移量,但不是时区。美国和加拿大的东部时间在 DST 的 -05:00 和 -04:00 之间交替。您需要一种方法来指定像America/New_York 这样的 tzid,以便它可以决定每个时间戳的有效偏移量。我不确定这个环境是否支持。 是的。您可以将其作为时区字符串传递。

以上是关于BigQuery 自动将时间戳时区转换为 UTC的主要内容,如果未能解决你的问题,请参考以下文章

将时间戳转换为特定时区然后在 bigquery 中将其转换为日期时出现问题

在 VBA 中,如何以简单的方式将 UTC UNIX 时间戳转换为本地时区日期?

将UTC时间戳转换为熊猫中的本地时区问题

如何根据 bigquery 中的时区列将 UTC 时间转换为本地时区?

BigQuery 在解析时无法识别时区

Python:如何在不知道 DST 是不是生效的情况下将时区感知时间戳转换为 UTC