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 字符串到时间戳,在源中保留时区的主要内容,如果未能解决你的问题,请参考以下文章