あなたが今持っているものの問題 (余分な cast()
は別として) および to_date()
呼び出し) は、4 回目の反復で両方の条件が false であるため、再帰が停止することです。少しスキップして再び拾うようにするものは何もありません。そうしないと、永遠に続きます。再帰内で両方の範囲を達成できるとは思いません。
必要な最新の日付を再帰部分に入れ、その後必要な 2 つの範囲をフィルター処理できます。
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
プレ>ハードコーディングされた値を開始日と終了日のペアに置き換えることができます。範囲が重複する可能性がある場合、または 2 番目の範囲が最初の範囲より前になる (または終了する) 可能性がある場合は、より高い日付を選択できます:
WHERE ADD_MONTHS(TRUNC(cte_date, 'MONTH'), 1) <= greatest(date '2015-01-27', date '2014-04-27')
プレ>... ただし、それは変数でのみ意味があり、固定値では意味がありません。