代码之家  ›  专栏  ›  技术社区  ›  Waku-2 Cyril Gandon

google bigquery从现在到n天前的时间戳列中选择

  •  7
  • Waku-2 Cyril Gandon  · 技术社区  · 6 年前

    我在bigquery中有一个带有时间戳列“register\u date”(示例值“2017-11-19 22:45:05.000 UTC”)的数据集。

    我需要根据今天之前x天或几周的标准筛选记录。 示例查询 选择2周前的所有记录。

    目前,我有一个查询(我觉得这是一种黑客行为),可以运行并返回正确的结果

    SELECT * FROM `my-pj.my_dataset.sample_table`
    WHERE
     (SELECT
      CAST(DATE(register_date) AS DATE)) BETWEEN DATE_ADD(CURRENT_DATE(), INTERVAL -150 DAY)
      AND CURRENT_DATE()
    LIMIT 10
    

    我的问题是,我是否必须在时间戳列上使用所有强制转换的内容(这似乎使原本简单的查询过于复杂)? 如果删除铸造零件,则查询不会运行并返回错误。

    这是我的简化查询

    SELECT
      *
    FROM
      `my-pj.my_dataset.sample_table`
    WHERE
      register_date BETWEEN DATE_ADD(CURRENT_DATE(), INTERVAL -150 DAY)
      AND CURRENT_DATE()
    LIMIT
      10
    

    这会导致一个错误

    Query Failed
    Error: No matching signature for operator BETWEEN for argument types: TIMESTAMP, DATE, DATE. Supported signature: (ANY) BETWEEN (ANY) AND (ANY) at [6:17]
    

    任何见解都将受到高度赞赏。

    1 回复  |  直到 6 年前
        1
  •  16
  •   Navpreet Singh    3 年前

    使用 timestamp 功能:

    SELECT t.*
    FROM `my-pj.my_dataset.sample_table` t
    WHERE register_date BETWEEN TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -150 DAY) AND CURRENT_TIMESTAMP()
    LIMIT 10;
    

    BigQuery有三种日期/时间值数据类型: date , datetime 时间戳 . 这些不能相互互换。其基本思想是:

    • Dates 没有时间成分和时区。
    • Datetimes 有时间成分,没有时区。
    • Timestamp 具有时间组件和时区。事实上,它代表UTC的值。

    INTERVAL 值在中定义 gcp documentation

    不同值之间的转换不是自动的。您的错误消息表明 register_date 实际上存储为 时间戳 .

    一个警告(根据个人经验):一天的定义基于UTC。如果你在伦敦,这不是什么大问题。如果您在另一个时区,并且希望“天”的定义基于本地时区,那么这可能是一个更大的问题。如果这对你来说是一个问题,请问另一个问题。