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

时间:2018-01-26 09:08:51

标签: sql google-bigquery gcp

我在bigquery中有一个带有TIMESTAMP列的数据集" register_date" (样本值" 2017-11-19 22:45:05.000 UTC")。

我需要根据今天标准前几天或几周过滤记录。 示例查询 选择所有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

我的问题是我是否必须在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]

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

1 个答案:

答案 0 :(得分: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有三种数据类型用于日期/时间值:datedatetimetimestamp。这些不可互换。基本思路是:

  • Dates没有时间组件且没有时区。
  • Datetimes有时间组件,没有时区。
  • Timestamp同时包含时间组件和时区。实际上,它代表UTC中的值。

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

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

相关问题