Bạn có thể sử dụng kiểm đếm:đó là một giải pháp dựa trên tập hợp, hoạt động tốt hơn đệ quy khi số lần lặp lại tăng lên - và nó được hỗ trợ trong các chế độ xem.
Đây là một cách tiếp cận:
select t.objectid, t.amount, dateadd(day, x.n, t.begindate) as dt
from (
select row_number() over (order by (select null)) - 1
from (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n)
cross join (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
cross join (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)
) x(n)
inner join tabledatarange t
on dateadd(day, x.n, t.begindate) <= case
when enddate <= convert(date, getdate()) then enddate
else convert(date, getdate())
end
Việc kiểm đếm tạo ra tất cả các số từ 0 đến 999 (bạn có thể dễ dàng mở rộng nó bằng cách thêm cross join
S). Chúng tôi sử dụng nó để "nhân" các hàng của bảng gốc và tạo phạm vi ngày.
Tôi đã cố gắng viết lại phần xử lý ngày kết thúc. Tôi hiểu rằng bạn không muốn có các ngày trong tương lai, vì vậy đó là điều kiện trong on
mệnh đề không.
Đối với dữ liệu mẫu này:
ObjectId | Amount | beginDate | endDate -------: | -----: | :--------- | :--------- 1 | 500 | 2020-12-28 | null 2 | 35 | 2019-09-26 | 2019-10-01 3 | 200 | 2020-05-28 | 2020-06-02
Truy vấn trả về:
objectid | amount | dt -------: | -----: | :--------- 1 | 500 | 2020-12-28 1 | 500 | 2020-12-29 1 | 500 | 2020-12-30 1 | 500 | 2020-12-31 2 | 35 | 2019-09-26 2 | 35 | 2019-09-27 2 | 35 | 2019-09-28 2 | 35 | 2019-09-29 2 | 35 | 2019-09-30 2 | 35 | 2019-10-01 3 | 200 | 2020-05-28 3 | 200 | 2020-05-29 3 | 200 | 2020-05-30 3 | 200 | 2020-05-31 3 | 200 | 2020-06-01 3 | 200 | 2020-06-02