Oracle
 sql >> база данни >  >> RDS >> Oracle

Създайте списък с всички месеци от колона с дата в ORACLE SQL

Направил си правописна грешка и си написал дата вместо дати но също така трябва да направите втора промяна и да използвате 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)) ИЗБЕРЕТЕ * ОТ 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 )ИЗБЕРЕТЕ min_date КАТО monthFROM t1 

db<>fiddle тук

Актуализация

Oracle 11gR2 има грешки, обработващи рекурсивни заявки за дата; това е коригирано в по-късните версии на Oracle, но ако искате да използвате SQL Fiddle и Oracle 11gR2, тогава трябва да повторите числова стойност, а не дата. Нещо подобно:

SQL Fiddle

Настройка на схема на 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 месец+1<=общо_месеци)SELECT ADD_MONTHS(min_date,month) AS monthFROM t1 

Резултати :

<предварителен код>| МЕСЕЦ ||-----------------------|| 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. Oracle 11g на Mac OS X

  2. Конкатениране на колекции в PLSQL

  3. Нулирайте последователността на Oracle, за да има МИН. СТОЙНОСТ =1 и НАЧАЛНО число от 1

  4. Функция CURRENT_DATE в Oracle

  5. Мога ли да насоча редове с дати в колони, без да се налага да посочвам датите в осевата таблица? Oracle SQL