BigQuery 字符串到时间戳,在源中保留时区

Posted

技术标签:

【中文标题】BigQuery 字符串到时间戳,在源中保留时区【英文标题】:BigQuery String to Timestamp retaining Timezone in Source 【发布时间】:2017-06-17 09:38:41 【问题描述】:

我查看了其他类似的帖子,但不确定他们是否能恰当地回答这个问题 - 也许他们会,如果我错过了任何可以回答这个问题的观点,抱歉。

我有一个字符串

"2017-06-16T10:34:57.705+01:00"

如何将其从字符串转换为“时间戳”类型,但保留精度(毫秒)和时区偏移量?

TIMESTAMP("2017-06-16T10:34:57.705+01:00")

转换为 UTC 时间戳并失去毫秒精度,我想要时间戳类型但保留本地日期的所有精度和时区?

FORMAT_TIMESTAMP("%Y-%m-%dT%H:%M:%E*S%Ez",PARSE_TIMESTAMP("%Y-%m-%dT%H:%M:%E*S%Ez", "2017-06-16T10:34:57.705+01:00"),"Europe/London")

这保留了精确度并具有偏移量,但它是一个字符串 - 然后我在尝试再次转换为时间戳时丢失了 TIMESTAMP(x)!

我觉得我在兜圈子任何帮助感谢感谢!

干杯

【问题讨论】:

【参考方案1】:

TIMESTAMP 类型是相对于 UNIX 纪元的某个时间点。尽管TIMESTAMP 相关函数默认使用UTC,但它具有微秒精度并且不编码时区,例如用于提取DATE

目前尚不清楚为什么要保留时间戳的原始时区,但您可以做的一件事是保留一个带有与 UTC 的偏移量的整数列,您可以在忽略输入时间戳之间使用 TIMESTAMP_DIFF 计算它在字符串中的时区和使用它在字符串中的时区的输入时间戳。

对于精度,您可以检查提供的时间戳和TIMESTAMP_TRUNC 的结果是否相等,例如MILLISECOND 看看精度是多少。我不知道您想对这些信息做什么,但您也可以使用字符串或整数来表示精度。

【讨论】:

感谢 Elliot - 保留时区的原因是基于时间的查询(例如翻转窗口)正在使用(至少向该地区的用户显示)图表上的本地时间,而不是 UTC。我们在世界各地设有办事处,并希望显示相关时间(例如下订单),包括保留夏令时/夏季时间等信息。无论如何,我确实将原始文件存储为字符串,因为它以 JSON 形式出现。感谢 cmets 非常感谢【参考方案2】:

作为补充,当您应用 PARSE_TIMESTAMP 时,您实际上并没有丢失精度,因为您可以使用 UNIX_MILLIS 函数进行检查:

WITH data AS(
  SELECT "2017-06-16T10:34:57.705+01:00" as date union all
  SELECT "2017-06-16T10:34:57.999+01:00" as date
)

SELECT
  date,
  UNIX_MILLIS(PARSE_TIMESTAMP("%Y-%m-%dT%H:%M:%E*S%Ez", date, "Europe/London")) millis_date
FROM data

结果:

Row date                            millis_date  
1   2017-06-16T10:34:57.999+01:00   1497605697999    
2   2017-06-16T10:34:57.705+01:00   1497605697705    

【讨论】:

以上是关于BigQuery 字符串到时间戳,在源中保留时区的主要内容,如果未能解决你的问题,请参考以下文章

Redshift - 将时区偏移量(Varchar)添加到时间戳列

将五个小时添加到时间戳字段

bigquery 使用时区转换字符串日期时间

Oracle 字符串到日期到时间戳

AWS Glue ETL Spark- 字符串到时间戳

BigQuery - 使用默认值将字符串转换为时间戳