假设 Sql Server 2005 或更新版本。
CTE 部分将返回跨越 @startDate 和 @endDate 之间年份的月份数。主体将月份数字与对 Items.StartDate 和 Items.EndDate 执行相同转换的项目连接起来。
; with months (month) as (
select datediff (m, 0, @startDate)
union all
select month + 1
from months
where month < datediff (m, 0, @endDate)
)
select year (Items.StartDate) Year,
month (Items.StartDate) Month,
count (*) NumberOfItems
from months
inner join Items
on datediff (m, 0, Items.StartDate) <= months.month
and datediff (m, 0, Items.EndDate) >= months.month
group by
year (Items.StartDate),
month (Items.StartDate)
注意:如果您打算跨越一百个月,您将需要option (maxrecursion 0)
在查询结束时。