BigQuery递归生成日期失败,求问题原因(仅用于学习)
问题排查与修正方案
原代码的核心问题
- 终止条件逻辑完全失效:原WHERE子句里的
days >= DATE_SUB(days, INTERVAL 30 DAY)是恒成立的(任何日期减去30天必然小于自身),再加上days <= CURRENT_DATE()也无法限制递归停止,会导致递归无限执行直到触发BigQuery的递归层数上限报错。 - 初始值与目标范围不匹配:你需要从固定日期'2025-05-29'开始回溯,但原代码用
CURRENT_DATE()作为起始值,动态日期会偏离你的目标范围。
修正后的递归查询代码
WITH RECURSIVE gen_dates AS ( SELECT DATE('2025-05-29') AS days -- 明确指定起始回溯的日期 UNION ALL SELECT DATE_SUB(days, INTERVAL 1 DAY) FROM gen_dates WHERE days > DATE('2025-04-29') -- 终止条件:日期未到达回溯的边界时继续递归 ) SELECT * FROM gen_dates;
逻辑说明
- 递归初始层:直接设置目标结束日期'2025-05-29'作为初始行,确保从你需要的日期开始回溯。
- 递归迭代层:每次从上一层的日期减去1天,生成前一天的日期。
- 终止条件:当当前日期大于'2025-04-29'时继续递归,一旦生成的日期等于'2025-04-29',该条件不满足,递归停止,最终得到完整的日期序列。
内容的提问来源于stack exchange,提问作者marie20
相关产品推荐
相关产品推荐

