google bigquery select 从现在到 n 天前的时间戳列
google bigquery select from a timestamp column between now and n days ago
我在 bigquery 中有一个带有 TIMESTAMP 列的数据集 "register_date"(示例值“2017-11-19 22:45:05.000 UTC”)。
我需要根据今天前 x 天或 x 周的标准筛选记录。
示例查询
select 所有 2 周前的记录。
目前我有这个查询(我觉得它是一种 hack)有效并且 returns 正确的结果
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 部分,我的查询不会 运行 和 returns 错误。
这是我的简化查询
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]
非常感谢任何见解。
使用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/time 个值的三种数据类型:date
、datetime
和 timestamp
。这些是不可互换的。基本思路是:
Dates
没有时间成分和时区。
Datetimes
有时间成分,没有时区。
Timestamp
具有时间分量和时区。实际上,它代表的是UTC中的值。
INTERVAL
值在 gcp documentation
中定义
不同值之间的转换不是自动的。您的错误消息表明 register_date
确实存储为 Timestamp
.
一个警告(根据个人经验):天的定义基于 UTC。如果您在伦敦,这不是什么大问题。如果您在另一个时区并且您希望“天”的定义基于当地时区,这可能是一个更大的问题。如果这对您来说是个问题,请提出另一个问题。
我在 bigquery 中有一个带有 TIMESTAMP 列的数据集 "register_date"(示例值“2017-11-19 22:45:05.000 UTC”)。
我需要根据今天前 x 天或 x 周的标准筛选记录。 示例查询 select 所有 2 周前的记录。
目前我有这个查询(我觉得它是一种 hack)有效并且 returns 正确的结果
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 部分,我的查询不会 运行 和 returns 错误。
这是我的简化查询
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]
非常感谢任何见解。
使用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/time 个值的三种数据类型:date
、datetime
和 timestamp
。这些是不可互换的。基本思路是:
Dates
没有时间成分和时区。Datetimes
有时间成分,没有时区。Timestamp
具有时间分量和时区。实际上,它代表的是UTC中的值。
INTERVAL
值在 gcp documentation
不同值之间的转换不是自动的。您的错误消息表明 register_date
确实存储为 Timestamp
.
一个警告(根据个人经验):天的定义基于 UTC。如果您在伦敦,这不是什么大问题。如果您在另一个时区并且您希望“天”的定义基于当地时区,这可能是一个更大的问题。如果这对您来说是个问题,请提出另一个问题。