BigQuery基于日期WHERE条件查询指定范围数据的问题咨询
BigQuery日期范围筛选正确实现方式
原有写法错误说明
你之前的两种写法存在以下核心问题:
- 第一种写法:WHERE子句不支持用AS定义字段别名,且时间范围逻辑写反(应该是大于等于起始时间、小于等于结束时间,你写反了必然查不到符合要求的数据)
- 第二种写法:类型转换语法不符合BigQuery规范,筛选逻辑完全不匹配日期范围查询的需求,存在类型不匹配的问题
正确实现方案
场景1:目标列存储的是dd/mm/yyyy格式的字符串
直接在WHERE中写转换逻辑即可:
SELECT COUNT(*) FROM `my-one-330114.results_out.results_validation_out` t WHERE DATE(PARSE_DATETIME('%d/%m/%Y', t.{col})) BETWEEN {start_time} AND {end_time}
如果需要多次使用转换后的日期,可以用CTE预处理避免重复写转换逻辑:
WITH processed_data AS ( SELECT *, DATE(PARSE_DATETIME('%d/%m/%Y', t.{col})) AS date_conv FROM `my-one-330114.results_out.results_validation_out` t ) SELECT COUNT(*) FROM processed_data WHERE date_conv >= {start_time} AND date_conv <= {end_time}
场景2:目标列存储的是yyyyMMdd格式的整数
先转字符串再解析为日期即可:
SELECT COUNT(*) FROM `my-one-330114.results_out.results_validation_out` t WHERE DATE(PARSE_DATE('%Y%m%d', CAST(t.{column} AS STRING))) BETWEEN {start_time} AND {end_time}
注意事项
- 传入的
{start_time}和{end_time}需要是DATE类型,或者是符合YYYY-MM-DD格式的合法日期字符串 - 确保PARSE类函数的格式串和目标列的实际日期格式完全匹配,避免解析出错
BETWEEN会包含左右两个边界值,如果你不需要包含某一边界,可以自行替换为>=和<的组合逻辑
内容的提问来源于stack exchange,提问作者Martin Xristev
相关产品推荐
相关产品推荐

