Oracle có một loạt các hàm thao tác ngày tháng tốt . Hai cái thích hợp cho vấn đề này là
-
MONTHS_BETWEEN()
tính toán số tháng giữa hai ngày -
ADD_MONTHS()
tăng một ngày theo số tháng nhất định
Chúng tôi có thể kết hợp các hàm này để tạo một bảng gồm tất cả các tháng được kéo dài bởi các bản ghi trong bảng của bạn. Sau đó, chúng tôi sử dụng kết nối bên ngoài để kết hợp có điều kiện các bản ghi từ USER_INFO vào lịch đó. Khi không có bản ghi nào khớp với count(id)
sẽ bằng không.
with cte as (
select max(trunc(created, 'MM')) as max_dt
, min(trunc(created, 'MM')) as min_dt
from user_info
)
, cal as (
select add_months(min_dt, (level-1)) as mth
from cte
connect by level <= months_between(max_dt, min_dt) + 1
)
select to_char(cal.mth, 'YYYY-MM') as operation
, count(id)
from cal
left outer join user_info
on trunc(user_info.created, 'mm') = cal.mth
group by rollup (cal.mth)
order by 1
/