BigQuery中如何精准获取仅30天前的单日数据?
BigQuery提取30天前单日数据的正确方法
你的问题出在时间区间的定义上:使用TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)和TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 29 DAY)作为范围时,会因为当前时间的时分秒导致区间覆盖两个自然日。比如当前时间是2022-08-03 10:00:00 UTC,30天前是2022-08-02 10:00:00 UTC,29天前是2022-08-03 10:00:00 UTC,这个区间会包含2022-08-02 10点到2022-08-03 10点的数据,自然出现两天的记录。
以下两种方法可以精准获取30天前的单日数据:
方法一:直接匹配日期部分
SELECT FORMAT_DATE("%d/%m/%Y", createddatetime1) AS dated, brand, orderid FROM `TABLE` WHERE DATE(createddatetime1) = DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
- 逻辑:
CURRENT_DATE()返回当前UTC日期(不含时分秒),DATE_SUB(..., INTERVAL 30 DAY)得到30天前的完整日期;DATE(createddatetime1)将时间戳转换为日期格式,两者匹配即可锁定当天所有数据。
方法二:限定时间戳在自然日边界内
SELECT FORMAT_DATE("%d/%m/%Y", createddatetime1) AS dated, brand, orderid FROM `TABLE` WHERE createddatetime1 >= TIMESTAMP(DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)) AND createddatetime1 < TIMESTAMP(DATE_SUB(CURRENT_DATE(), INTERVAL 29 DAY))
- 逻辑:
TIMESTAMP(DATE_SUB(...))会将日期转换为当天0点的时间戳(比如30天前的日期2022-08-02会转为2022-08-02 00:00:00 UTC),29天前的日期则转为次日0点的时间戳。用>=和<组合,能精准覆盖目标自然日的所有数据,不会包含次日的任何记录。
内容的提问来源于stack exchange,提问作者Jamie Degiorgio
相关产品推荐
相关产品推荐

