Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Utwórz listę wszystkich miesięcy z kolumny daty w ORACLE SQL

Zrobiłeś literówkę i napisałeś date zamiast dates ale musisz też dokonać drugiej zmiany i użyć ADD_MONTHS w WHERE zapytania rekurencyjnego lub wygenerujesz o jeden za dużo wierszy.

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

Które wyjścia:

Jednak bardziej wydajnym zapytaniem byłoby uzyskanie minimalnej i maksymalnej wartości w tym samym zapytaniu, a następnie iteracja przy użyciu tych wstępnie znalezionych granic:

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 tutaj

Aktualizacja

Oracle 11gR2 ma błędy w obsłudze rekurencyjnych zapytań o datę; zostało to naprawione w późniejszych wersjach Oracle, ale jeśli chcesz używać SQL Fiddle i Oracle 11gR2, musisz iterować po wartości liczbowej, a nie na dacie. Coś takiego:

Skrzypce SQL

Konfiguracja schematu Oracle 11g R2 :

CREATE TABLE dates(
alldates date);

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

Zapytanie 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

Wyniki :

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Połącz wiersze w CLOB

  2. NUMTODSINTERVAL w PostgreSQL

  3. Oracle (PL/SQL):Czy UPDATE RETURNING jest współbieżny?

  4. SQL, kaskadowe usuwanie i kaskadowe aktualizowanie

  5. Oracle sql (brak lewego nawiasu)