आपके पास अभी जो समस्या है (अतिरिक्त cast()
. के अलावा) और to_date()
कॉल) यह है कि चौथे पुनरावृत्ति पर दोनों स्थितियां झूठी हैं इसलिए रिकर्सन बंद हो जाता है; इसमें कुछ भी नहीं है कि इसे थोड़ा छोड़ दें और फिर से उठाएं, अन्यथा यह हमेशा के लिए जारी रहेगा। मुझे नहीं लगता कि आप रिकर्सन के भीतर दोनों श्रेणियों को प्राप्त कर सकते हैं।
आप अपनी इच्छित नवीनतम तिथि को पुनरावर्ती भाग के अंदर रख सकते हैं, और फिर बाद में अपनी इच्छित दो श्रेणियों को फ़िल्टर कर सकते हैं:
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')
... हालांकि यह केवल चर के साथ समझ में आता है, निश्चित मान नहीं।