PostgreSQL递归CTE列类型不匹配错误修正及日期序列生成求助
PostgreSQL递归CTE类型不匹配错误修正
错误原因
递归CTE的非递归部分返回的dt是date类型,但递归部分dt + interval '1 month'返回的是timestamp without time zone类型,列数据类型不统一,触发PostgreSQL的类型检查错误。
修正后的查询语句
WITH RECURSIVE cte_0 AS ( -- 直接将日期截断到月初并转为date类型,简化处理 SELECT MIN(date_trunc('month', day)::date) AS dt FROM Transactions UNION ALL -- 将递归计算的结果转为date,保证类型一致 SELECT (dt + INTERVAL '1 month')::date FROM cte_0 WHERE dt < (SELECT MAX(date_trunc('month', day)::date) FROM Transactions) ) SELECT * FROM cte_0;
关键修改点
- 简化日期处理:
date_trunc('month', day)直接转为date即可,无需先转字符串再转date,减少不必要的转换开销 - 统一递归项类型:将
dt + interval '1 month'的结果强制转为date,确保和非递归项的dt类型完全一致 - 优化条件子查询:同样简化日期截断逻辑,保持代码一致性
执行上述查询后,将得到预期结果:
2021-05-01 2021-06-01 2021-07-01
内容的提问来源于stack exchange,提问作者АЛлександр Рудинский
相关产品推荐
相关产品推荐

