使用CTE Oracle生成日期范围

Ahm*_*aji 3 oracle recursive-query common-table-expression

我想在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
Run Code Online (Sandbox Code Playgroud)

返回的结果与预期的完全不同:

10-02-2017
09-02-2017
08-02-2017
07-02-2017
06-02-2017
... (unlimited)
Run Code Online (Sandbox Code Playgroud)

预期结果:

10-02-2017
11-02-2017
...
19-02-2017
20-02-2017
Run Code Online (Sandbox Code Playgroud)

Oracle Database 11g Express Edition 11.2.0.2.0版-64位生产。

编辑: 据我了解,这是Oracle中的已知错误,该错误通过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')))
Run Code Online (Sandbox Code Playgroud)

mat*_*guy 5

这是Oracle 11中递归CTE的一个已知错误(特别是关于日期算术)。在Oracle 12中已修复。确切的行为是:无论您在代码中添加还是减去,引擎始终会减去,它永远不会相加。

编辑:实际上,正如Alex Poole在对原始帖子的评论中指出的那样,该错误通过Oracle 11.2.0.2存在,并且已在11.2.0.3中修复。结束编辑

las,我不是付费客户,因此我无法引用章节和经文,但是通过使用Google谷歌搜索的一点点,您将找到与此相关的链接(包括在OTN上,我参与了一些讨论此问题的主题以及递归的其他错误) CTE-有些是固定的,有些仍然是Oracle 12.1中的错误。

已添加 -这是其中的讨论之一:https : //community.oracle.com/thread/3974408