Google bigquery从现在到n天之间的时间戳列中进行选择

Wak*_*u-2 1 sql google-bigquery gcp

我在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
Run Code Online (Sandbox Code Playgroud)

我的问题是我是否必须在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
Run Code Online (Sandbox Code Playgroud)

导致错误

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]
Run Code Online (Sandbox Code Playgroud)

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

Gor*_*off 6

使用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;
Run Code Online (Sandbox Code Playgroud)

BigQuery的有日期/时间值三种数据类型: datedatetime,和timestamp。这些是不可互换的。基本思想是:

  • Dates 没有时间成分,也没有时区。
  • Datetimes 有时间成分,没有时区。
  • Timestamp同时具有时间部分和时区。实际上,它代表UTC中的值。

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

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