【问题标题】:BigQuery String to Timestamp retaining Timezone in SourceBigQuery 字符串到时间戳,在源中保留时区
【发布时间】: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)!

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

干杯

【问题讨论】:

    标签: google-bigquery


    【解决方案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    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      • 2020-08-27
      相关资源
      最近更新 更多