在 bigquery 标准 sql 上提取两个日期之间的小时数

Posted

技术标签:

【中文标题】在 bigquery 标准 sql 上提取两个日期之间的小时数【英文标题】:Extract hours between two date on bigquery standard sql 【发布时间】:2021-04-30 20:55:52 【问题描述】:

我正在尝试使用 Bigquery 中的 StandardSQL 从日期和时间范围内提取数据

基本上我所做的是,从定义日期到当前日期以及从定义日期的上午 9 点到当前日期的上午 9 点获取数据。

我尝试使用此查询,但它只返回从定义日期上午 9 点到定义日期的晚上 11;59 点的数据,我找不到当前日期的数据。但是如果我删除约束EXTRACT(HOUR FROM TIMESTAMP(DATETIME(registration_started_at, 'Asia/Jakarta'))) >= 9 它可以返回我想要的日期范围,但不能返回时间范围

SELECT * 
from `table`
WHERE (DATE(DATETIME(registration_started_at, 'Asia/Jakarta')) BETWEEN '2021-04-30' AND DATE(DATETIME(CURRENT_TIMESTAMP(), 'Asia/Jakarta')))
ORDER BY registration_updated_at ASC) a
WHERE EXTRACT(HOUR FROM DATETIME(CURRENT_TIMESTAMP(), 'Asia/Jakarta')) < 9
AND EXTRACT(HOUR FROM TIMESTAMP(DATETIME(registration_started_at, 'Asia/Jakarta'))) >= 9
Sample Data
+---------+------------------------------+
|   ID    |   registration_started_at    |
+---------+------------------------------+
|    1    |  2021-04-29 07:44:08.864 UTC |    
|    2    |  2021-04-30 11:46:58.451 UTC |
|    3    |  2021-04-30 20:10:27.748 UTC |   
|    4    |  2021-04-30 20:39:47.206 UTC |  
+---------+------------------------------+

预期输出(本地时区)--不是上面时间列的实际输出

+---------+------------------------------+
|   ID    |   registration_started_at    |
+---------+------------------------------+
|    2    |  2021-04-30T09:04:52.001000  |    
|    3    |  2021-04-30T11:02:43.232000  |
|    4    |  2021-05-01T08:00:10.569000  |    
+---------+------------------------------+

【问题讨论】:

样本数据和期望的结果真的很有帮助。您的代码很混乱,因为 datedatetime 都不代表时区,因此假定它们是当地时间。 对于此类任务,日期和时间应一起考虑,因为明天上午 10 点大于今天晚上 10 点。过滤日期时间,而不是日期部分 @ebuzz168 。 . . UTC 不是datetime,而是TIMESTAMP。您尚未阐明有关数据类型的问题。 【参考方案1】:

您的代码相当混乱。 DATETIME 没有时区,所以我真的不明白为什么需要使用时区来提取日期。

认为您只需要从“2021-04-30 09:00:00”到(但不包括“2021-05-01 09:00:00”)的范围。

如果是这样,从 DATETIME 值中减去 9 小时并与日期进行比较:

DATE(DATETIME_ADD(registration_started_at, INTERVAL -9 HOUR)) = DATE('2021-04-30')

【讨论】:

我想要一个从 '2021-04-30 09:00:00' 到 '2021-05-01 09:00:00' 的范围 时区发挥作用,因为current_date 取决于时区。但是它接受时区作为参数而无需任何额外的计算,原始OP的日期操作很麻烦。 @ebuzz168 some date 将介于 Day A 09:00:00Day B 09:00:00 之间,当且仅当 some day - 9 hours 介于 Day ADay B 之间。因此,对于不包括上限和单日,这个答案是最直接和最简单的解决方案。 @GordonLinoff 是的!谢谢先生。你有什么建议可以让我了解更多关于standardsql/bigquery中这个时间操作的信息吗? @ebuzz168 。 . .这不是关于时间函数,而是关于 9 小时与时区的简单混淆。只是需要练习。

以上是关于在 bigquery 标准 sql 上提取两个日期之间的小时数的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 标准 SQL 中的“yearweek”函数的等价物是啥?

无法使用 BigQuery 标准 SQL 提取特定 ID 的自定义维度

标准 SQL (BigQuery) 中整数 YYYYMMDD 的日期

Bigquery (Standard Sql) - 年月日期格式

带有日期列的 BigQuery 标准 SQL 表通配符

bigquery 标准 sql = 从字符串中提取数据