【问题标题】:google bigquery select from a timestamp column between now and n days agogoogle bigquery 从现在到 n 天前的时间戳列中选择
【发布时间】:2018-07-05 14:49:06
【问题描述】:

我在 bigquery 中有一个数据集,其中包含一个 TIMESTAMP 列“register_date”(示例值“2017-11-19 22:45:05.000 UTC”)。

我需要根据今天前 x 天或几周的条件过滤记录。 示例查询 选择所有 2 周前的记录。

目前我有这个查询(我觉得这是一种 hack)可以正常工作并返回正确的结果

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

我的问题是我是否必须在 TIMESTAMP 列上使用所有 CASTing 内容(这似乎使原本简单的查询过于复杂)? 如果我删除 CASting 部分,我的查询不会运行并返回错误。

这是我的简化查询

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]

高度赞赏任何见解。

【问题讨论】:

    标签: sql google-bigquery gcp


    【解决方案1】:

    使用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 具有三种日期/时间值数据类型:datedatetimetimestamp。这些不能相互互换。基本思路是:

    • Dates 没有时间组件,也没有时区。
    • Datetimes 有时间组件,没有时区。
    • Timestamp 既有时间分量又有时区。实际上,它代表 UTC 的值。

    INTERVAL 值在gcp documentation 中定义

    不同值之间的转换不是自动的。您的错误消息表明 register_date 确实存储为 Timestamp

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 2015-10-23
      • 2012-03-31
      相关资源
      最近更新 更多