आपने एक टाइपो बनाया और date
लिखा dates
. के बजाय लेकिन आपको दूसरा परिवर्तन करने और ADD_MONTHS
. का उपयोग करने की भी आवश्यकता है पुनरावर्ती क्वेरी के WHERE
. में खंड या आप एक बहुत अधिक पंक्तियाँ उत्पन्न करेंगे।
WITH t1(test) AS (
SELECT MIN(alldates)
FROM dates
UNION ALL
SELECT ADD_MONTHS(test,1)
FROM t1
WHERE ADD_MONTHS(test,1) <= (SELECT MAX(alldates) FROM dates)
)
SELECT * FROM t1
कौन सा आउटपुट:
हालांकि, एक अधिक कुशल क्वेरी एक ही क्वेरी में न्यूनतम और अधिकतम मान प्राप्त करना और फिर इन पूर्व-पाई गई सीमाओं का उपयोग करके पुनरावृति करना होगा:
WITH t1(min_date, max_date) AS (
SELECT MIN(alldates),
MAX(alldates)
FROM dates
UNION ALL
SELECT ADD_MONTHS(min_date,1),
max_date
FROM t1
WHERE ADD_MONTHS(min_date,1) <= max_date
)
SELECT min_date AS month
FROM t1
db<>fiddle यहां
अपडेट करें
Oracle 11gR2 में पुनरावर्ती दिनांक प्रश्नों को संभालने वाले बग हैं; यह बाद के Oracle संस्करणों में तय किया गया है, लेकिन यदि आप SQL Fiddle और Oracle 11gR2 का उपयोग करना चाहते हैं तो आपको एक संख्यात्मक मान पर पुनरावृति करने की आवश्यकता है, न कि किसी तिथि पर। कुछ इस तरह:
Oracle 11g R2 स्कीमा सेटअप :
CREATE TABLE dates(
alldates date);
INSERT INTO dates (alldates) VALUES ('1-May-2017');
INSERT INTO dates (alldates) VALUES ('1-Mar-2018');
क्वेरी 1 :
WITH t1(min_date, month, total_months) AS (
SELECT MIN(alldates),
0,
MONTHS_BETWEEN(MAX(alldates),MIN(alldates))
FROM dates
UNION ALL
SELECT min_date,
month+1,
total_months
FROM t1
WHERE month+1<=total_months
)
SELECT ADD_MONTHS(min_date,month) AS month
FROM t1
परिणाम :
| MONTH |
|----------------------|
| 2017-05-01T00:00:00Z |
| 2017-06-01T00:00:00Z |
| 2017-07-01T00:00:00Z |
| 2017-08-01T00:00:00Z |
| 2017-09-01T00:00:00Z |
| 2017-10-01T00:00:00Z |
| 2017-11-01T00:00:00Z |
| 2017-12-01T00:00:00Z |
| 2018-01-01T00:00:00Z |
| 2018-02-01T00:00:00Z |
| 2018-03-01T00:00:00Z |