BigQuery:将纪元转换为时间戳

BigQuery: convert epoch to TIMESTAMP

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

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.visitStartTime 是一个 INT64 纪元,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 方言中具有可比性?

您可以像 TIMESTAMP_SECONDSTIMESTAMP_MILLISTIMESTAMP_MICROS

这样使用 timestamp conversion functions

例如,假设您的 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  

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

  • DATE_FROM_UNIX_DATE - 从 days epoch 到 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