在 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 |
+---------+------------------------------+
【问题讨论】:
样本数据和期望的结果真的很有帮助。您的代码很混乱,因为date
或 datetime
都不代表时区,因此假定它们是当地时间。
对于此类任务,日期和时间应一起考虑,因为明天上午 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:00
和 Day B 09:00:00
之间,当且仅当 some day - 9 hours
介于 Day A
和 Day B
之间。因此,对于不包括上限和单日,这个答案是最直接和最简单的解决方案。
@GordonLinoff 是的!谢谢先生。你有什么建议可以让我了解更多关于standardsql/bigquery中这个时间操作的信息吗?
@ebuzz168 。 . .这不是关于时间函数,而是关于 9 小时与时区的简单混淆。只是需要练习。以上是关于在 bigquery 标准 sql 上提取两个日期之间的小时数的主要内容,如果未能解决你的问题,请参考以下文章
BigQuery 标准 SQL 中的“yearweek”函数的等价物是啥?
无法使用 BigQuery 标准 SQL 提取特定 ID 的自定义维度
标准 SQL (BigQuery) 中整数 YYYYMMDD 的日期