sql >> Database teknologi >  >> RDS >> Oracle

Opret alle måneders liste fra en datokolonne i ORACLE SQL

Du lavede en tastefejl og skrev dato i stedet for datoer men du skal også foretage en anden ændring og bruge ADD_MONTHS i den rekursive forespørgsel's WHERE eller du vil generere en række for mange.

MED 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)) VÆLG * FRA t1

Hvilken udgang:

En mere effektiv forespørgsel ville dog være at hente minimums- og maksimumværdierne i den samme forespørgsel og derefter iterere ved at bruge disse forudfundne grænser:

MED t1(min_dato, maks_dato) AS (VÆLG MIN(alledatoer), MAX(alledatoer) FRA datoer UNION ALLE VÆLG TILFØJ_MÅNED(min_dato,1), maks.dato FRA t1 HVOR ADD_MÅNED(min_dato,1) <=maks.dato )SELECT min_date AS monthFROM t1

db<>fiddle her

Opdater

Oracle 11gR2 har fejl, der håndterer rekursive datoforespørgsler; dette er rettet i senere Oracle-versioner, men hvis du vil bruge SQL Fiddle og Oracle 11gR2, skal du iterere over en numerisk værdi og ikke en dato. Noget som dette:

SQL Fiddle

Oracle 11g R2 Schema Setup :

OPRET TABEL-datoer(alle datoer dato);INDSÆT I datoer (alledatoer) VÆRDIER ('1-maj-2017');INDSÆT I datoer (alle datoer) VÆRDIER ('1-Mar-2018'); 

Forespørgsel 1 :

MED t1(min_dato, måned, total_måneder) AS (VÆLG MIN(alle datoer), 0, MONTHS_BETWEEN(MAX(alledatoer),MIN(alledatoer)) FRA datoer UNION ALLE VÆLG min_dato, måned+1, total_måneder FROM t1 WHERE month+1<=total_months)SELECT ADD_MONTHS(min_date,month) AS monthFROM t1 

Resultater :

| MÅNED ||-----------------------------|| 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. SQL 2 tæller med forskelligt filter

  2. Hvordan kan jeg flytte data fra en tabel til en anden i rails migration?

  3. MySQL - Effektiv søgning med delvis ordmatch og relevansscore (FULLTEXT)

  4. Sådan får du den bedste brug af kommentarfunktionen i MySQL