Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Erstellen Sie eine Liste aller Monate aus einer Datumsspalte in ORACLE SQL

Sie haben sich vertippt und date geschrieben anstelle von dates aber Sie müssen auch eine zweite Änderung vornehmen und ADD_MONTHS verwenden im WHERE der rekursiven Abfrage -Klausel oder Sie generieren eine Zeile zu viel.

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

Welche Ausgaben:

Eine effizientere Abfrage wäre jedoch, die Minimal- und Maximalwerte in derselben Abfrage abzurufen und dann mit diesen vorab gefundenen Grenzen zu iterieren:

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 hier

Aktualisieren

Oracle 11gR2 hat Fehler bei der Behandlung rekursiver Datumsabfragen; Dies wurde in späteren Oracle-Versionen behoben, aber wenn Sie SQL Fiddle und Oracle 11gR2 verwenden möchten, müssen Sie über einen numerischen Wert und nicht über ein Datum iterieren. Etwa so:

SQL-Fiddle

Oracle 11g R2-Schema-Setup :

CREATE TABLE dates(
alldates date);

INSERT INTO dates  (alldates) VALUES ('1-May-2017');
INSERT INTO dates  (alldates) VALUES ('1-Mar-2018');

Abfrage 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

Ergebnisse :

|                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 |