Có thể thực hiện điều này trong SQL. Có hai thủ thuật. Đầu tiên là tạo một chuỗi số, bạn có thể thực hiện với CTE bằng cách sử dụng connect
.
Thứ hai là kết hợp logic phù hợp để mở rộng ngày tháng, trong khi vẫn giữ đúng thời điểm bắt đầu và kết thúc.
Sau đây là một ví dụ:
with n as (
select level n
from dual connect by level <= 20
),
t as (
select 1 as id, to_date('01/01/2000 4', 'mm/dd/yyyy hh') as StartDate, to_date('01/03/2000 6', 'mm/dd/yyyy hh') as EndDate from dual union all
select 2 as id, to_date('01/04/2000 8', 'mm/dd/yyyy hh') as StartDate, to_date('01/04/2000 12', 'mm/dd/yyyy hh') as EndDate from dual union all
select 3 as id, to_date('01/05/2000', 'mm/dd/yyyy') as StartDate, to_date('01/06/2000', 'mm/dd/yyyy') as EndDate from dual
)
select t.id,
(case when n = 1 then StartDate
else trunc(StartDate + n - 1)
end) as StartDate,
(case when trunc(StartDate + n - 1) = trunc(enddate)
then enddate
else trunc(StartDate + n)
end)
from t join
n
on StartDate + n - 1 <= EndDate
order by id, StartDate
Đây là trên SQLFiddle.