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

ORACLE SQL:Utwórz nowy wiersz na podstawie zakresu dat

Możesz użyć zapytania rekurencyjnego (które będzie działać niezależnie od tego, ile miesięcy obejmuje Twój zakres):

WITH months ( id, start_date, end_date, final_date ) AS (
  SELECT id,
         start_date,
         LEAST( LAST_DAY( start_date ), end_date ),
         end_date
  FROM   table_name
UNION ALL
  SELECT id,
         end_date + INTERVAL '1' DAY,
         LEAST( ADD_MONTHS( end_date, 1 ), final_date ),
         final_date
  FROM   months
  WHERE  end_date < final_date
)
SEARCH DEPTH FIRST BY final_date SET dt_order
SELECT id,
       start_date,
       end_date
FROM   months;

Co dla przykładowych danych:

CREATE TABLE table_name (id, start_date, end_date) AS
SELECT 44, DATE '2020-01-04', DATE '2020-01-04' FROM DUAL UNION ALL
SELECT 44, DATE '2020-01-30', DATE '2020-02-10' FROM DUAL UNION ALL
SELECT 44, DATE '2020-02-27', DATE '2020-03-03' FROM DUAL;

Wyjścia:

db<>fiddle tutaj



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. procedura składowana do wybierania wszystkich wierszy z tabeli w Oracle

  2. trzeba grupować rekordy na podstawie pasujących odwróceń

  3. Komunikat o błędzie Perl DBI:Nie można wywołać metody selectcol_arrayref na niezdefiniowanej wartości

  4. Oracle:Używanie wartości kolumny Pseudo w tej samej instrukcji Select

  5. Jak uzyskać nazwę klasy sterownika (nie nazwę sterownika) z połączenia jdbc?