【问题标题】:BigQuery: convert epoch to TIMESTAMPBigQuery:将纪元转换为 TIMESTAMP
【发布时间】:2016-10-18 02:34:18
【问题描述】:

我正在尝试对两个表进行范围连接,就像这样

SELECT *
FROM main_table h
INNER JOIN
    test.delay_pairs d
ON
    d.interval_start_time_utc < h.visitStartTime
    AND h.visitStartTime < d.interval_end_time_utc

其中h.visitStartTimeINT64 纪元,d.interval_start_time_utcd.interval_end_time_utc 是正确的TIMESTAMPs。

以上失败

No matching signature for operator < for argument types: TIMESTAMP, INT64. Supported signature: ANY < ANY

TIMESTAMP()CAST(d.interval_start_time_utc AS INT64) 中包装h.visitStartTime 都不起作用。如何在 BigQuery 的标准 SQL 方言中使两者具有可比性?

【问题讨论】:

    标签: google-bigquery timestamp epoch


    【解决方案1】:

    使用 standard sql,您可以使用其中一种,具体取决于精度:

    • DATE_FROM_UNIX_DATE - 从几天到现在
    • TIMESTAMP_SECONDS - 从秒纪元到时间戳
    • TIMESTAMP_MILLIS - 从毫秒纪元到时间戳
    • TIMESTAMP_MICROS - 从微秒纪元到时间戳

    在此处查看文档:https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#timestamp_seconds

    使用 legacy sql,您只需使用 TIMESTAMP 函数并乘以或除以 1000 即可将其带到所需的纪元类型:

    SELECT 
      TIMESTAMP(epoch_in_millis / 1000) AS datetime
    FROM 
      my_table
    

    【讨论】:

      【解决方案2】:

      您可以使用timestamp conversion functions,例如TIMESTAMP_SECONDSTIMESTAMP_MILLISTIMESTAMP_MICROS

      例如,假设您的 h.visitStartTime 自 unix 纪元以来是微秒

      SELECT *
      FROM main_table h
      INNER JOIN test.delay_pairs d
      ON d.interval_start_time_utc < TIMESTAMP_MICROS(h.visitStartTime)
      AND TIMESTAMP_MICROS(h.visitStartTime) < d.interval_end_time_utc  
      

      【讨论】:

      • visitStartTime 实际上是自纪元以来的秒数(https://support.google.com/analytics/answer/3437719?hl=en),但是是的,这行得通!
      • 哦。我还没有意识到这是谷歌分析数据:o)
      • 反函数是unix_micros(给我未来的自己)
      猜你喜欢
      • 1970-01-01
      • 2019-09-19
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 2015-03-17
      • 2020-07-09
      相关资源
      最近更新 更多