【发布时间】:2017-02-28 13:03:39
【问题描述】:
我想在 Oracle 中使用递归 WITH 子句生成两个不同日期之间的天数范围。
WITH CTE_Dates (cte_date) AS
( SELECT CAST(TO_DATE('10-02-2017', 'DD-MM-YYYY') AS DATE) cte_date FROM dual
UNION ALL
SELECT CAST( (cte_date + 1) AS DATE) cte_date
FROM CTE_Dates
WHERE TRUNC(cte_date) + 1 <= TO_DATE('20-02-2017', 'DD-MM-YYYY')
)
SELECT * FROM CTE_Dates
返回的结果与预期完全不同:
10-02-2017
09-02-2017
08-02-2017
07-02-2017
06-02-2017
... (unlimited)
预期结果:
10-02-2017
11-02-2017
...
19-02-2017
20-02-2017
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64 位生产。
编辑: 据我了解,这是Oracle中的一个已知Bug,该Bug存在于Oracle 11.2.0.2中,并已在11.2.0.3中修复。
替代解决方案:
SELECT TRUNC (TO_DATE('10-02-2017', 'DD-MM-YYYY') + ROWNUM -1) dt
FROM DUAL
CONNECT BY ROWNUM <= (TO_DATE('20-02-2017', 'DD-MM-YYYY') - (TO_DATE('10-02-2017', 'DD-MM-YYYY')))
【问题讨论】:
-
当我运行您发布的代码时,它会生成从
2017-02-10到2017-02-20的 11 行,这是您的预期结果。请重试。 -
您使用的是什么版本的数据库?递归 WITH 子句仅在 11gR2 及更高版本上受支持
-
无关,但是:
CAST(... AS DATE)没用。一个简单的TO_DATE('10-02-2017', 'DD-MM-YYYY')正在做同样的事情。 -
另外:如果要对行进行排序,则需要将
order by应用于整个select语句 -
@APC 您使用哪个版本?我的数据库版本是:Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production。
标签: oracle common-table-expression recursive-query