Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tạo các hàng riêng biệt cho mỗi tháng trong một phạm vi ngày

Bạn có thể sử dụng một kỹ thuật tạo hàng đơn giản bằng cách sử dụng CONNECT BY cú pháp:

with sample_data as 
  (select 'XXA' id, to_date('1/23/14','MM/DD/RR') start_date, to_date('3/12/14','MM/DD/RR') end_date from dual)
select id, to_char(add_months(start_date,level - 1),'Month YYYY') date_column
from sample_data
connect by level <= extract(month from end_date) - extract(month from start_date) + 1;

Chỉnh sửa Thêm DISTINCT sẽ cho phép điều này hoạt động trên các hàng, tôi tin rằng, mặc dù tôi muốn được chứng minh là sai. Chỉnh sửa 2 Đã sửa đổi ví dụ để xử lý nhiều năm (lẽ ra ban đầu nên làm điều đó). (Xem ví dụ http://sqlfiddle.com/#!4/9eecb/4097/ 0 .)

with sample_data as 
  ( select 'XXA' id, to_date('1/23/14','MM/DD/RR') start_date, to_date('3/12/15','MM/DD/RR') end_date from dual union all    
    select 'XXB' id, to_date('4/12/14','MM/DD/RR') start_date, to_date('6/18/15','MM/DD/RR') end_date from dual )
select distinct 
  id,
  to_char(add_months(start_date,level - 1),'Month YYYY') date_column,
  add_months(start_date,level -1) sortkey
from sample_data
connect by level <= ceil(months_between(trunc(end_date,'MM'), trunc(start_date,'MM'))) + 1
order by id, sortkey;

Trong hộp cát DB của tôi, kết quả là:

ID  DATE_COLUMN     SORT_COL
XXA January   2014  23-JAN-2014 00:00:00
XXA February  2014  23-FEB-2014 00:00:00
XXA March     2014  23-MAR-2014 00:00:00
XXB April     2014  12-APR-2014 00:00:00
XXB May       2014  12-MAY-2014 00:00:00
XXB June      2014  12-JUN-2014 00:00:00


  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 PL / SQL - Lặp lại tên cột của bảng được xác định cục bộ

  2. Sử dụng Oracle JDeveloper 12c với Cơ sở dữ liệu Oracle 12c trên Nền tảng đám mây Oracle, Phần 3

  3. tạo cột id dựa trên dữ liệu hoạt động

  4. Giá trị nhận dạng không hợp lệ trong truy vấn lồng đôi với ORDER BY và ROWNUM

  5. Làm cách nào tôi có thể kiểm tra null và không null cùng một lúc trong sql?