Oracle递归查询-日期

Oracle递归查询-日期,oracle,Oracle,我将两组日期传递到一个查询中,我希望找到两组日期之间的所有月份/年份 当我尝试这个: WITH CTE_Dates (cte_date) AS ( SELECT cast(date '2014-01-27' as date) from dual UNION ALL SELECT cast(ADD_MONTHS(TRUNC(cte_date, 'MONTH'),1) as date) FROM CTE_Dates WHERE ( TO_DATE(ADD_

我将两组日期传递到一个查询中,我希望找到两组日期之间的所有月份/年份

当我尝试这个:

WITH CTE_Dates (cte_date)  AS (
    SELECT cast(date '2014-01-27' as date)  from dual
    UNION ALL
    SELECT cast(ADD_MONTHS(TRUNC(cte_date, 'MONTH'),1) as date)
    FROM CTE_Dates
    WHERE ( TO_DATE(ADD_MONTHS(TRUNC(cte_date, 'MONTH'), 1)) BETWEEN TO_DATE ('27-01-2014','DD-MM-YYYY') AND TO_DATE ('27-04-2014','DD-MM-YYYY'))
        OR
          ( TO_DATE(ADD_MONTHS(TRUNC(cte_date, 'MONTH'), 1)) BETWEEN TRUNC(TO_DATE('27-11-2014','DD-MM-YYYY'), 'MONTH')  AND TO_DATE ('27-01-2015','DD-MM-YYYY'))
      )
SELECT * from CTE_Dates
我得到:

27-JAN-14
01-FEB-14
01-MAR-14
01-APR-14
我还想得到:

01-NOV-14
01-DEC-14
01-JAN-15
看起来WHERE子句的OR部分被忽略了

关于如何创建此查询的建议

谢谢
Cory

除了额外的cast和tou-date调用之外,现在的问题是,在第四次迭代中,两个条件都为false,因此递归停止;没有什么可以让它跳过一点,然后再捡起来,否则它将永远继续下去。我不认为你能在递归中同时达到这两个范围

您可以将所需的最新日期放在递归部分中,然后过滤之后所需的两个范围:

WITH CTE_Dates (cte_date)  AS (
    SELECT date '2014-01-27'  from dual
    UNION ALL
    SELECT ADD_MONTHS(TRUNC(cte_date, 'MONTH'), 1)
    FROM CTE_Dates
    WHERE ADD_MONTHS(TRUNC(cte_date, 'MONTH'), 1) <= date '2015-01-27'
)
SELECT * from CTE_Dates
WHERE cte_date BETWEEN date '2014-01-27' AND date '2014-04-27'
OR cte_date BETWEEN date '2014-11-27' AND date '2015-01-27';

CTE_DATE 
---------
27-JAN-14 
01-FEB-14 
01-MAR-14 
01-APR-14 
01-DEC-14 
01-JAN-15 

 6 rows selected 
您可以用开始日期和结束日期对替换硬编码的值。如果两个范围可能重叠,或者第二个范围可能在第一个范围之前,或者在第一个范围之前结束,则可以选择更高的日期:

    WHERE ADD_MONTHS(TRUNC(cte_date, 'MONTH'), 1)
      <= greatest(date '2015-01-27', date '2014-04-27')

。。。虽然这只适用于变量,而不适用于固定值。

所以有两组范围?它们会重叠吗?是的,两组范围可能会重叠。谢谢,我有额外的强制转换,因为如果我不强制转换,那么我会得到ORA-01790:表达式必须与相应的表达式具有相同的DatayType这对我有效,如图所示;但也许你真正的版本是传递时间戳,而不是日期,然后需要进行强制转换。不过,你不需要投任何一个加号。