使用TSQL对具有开始和结束日期的对象进行每月计数

使用TSQL对具有开始和结束日期的对象进行每月计数,tsql,count,Tsql,Count,我想创建一个条形图,显示每月可用的对象数量。所有行都有开始和结束日期。我知道如何计算一个月的数量: SELECT COUNT(*) As NumberOfItems FROM Items WHERE DATEPART(MONTH, Items.StartDate) <= @monthNumber AND DATEPART(MONTH, Items.EndDate) >= @monthNumber 现在,我想创建SQL,使用一个SELECT语句来获取月数和项数 有什么优雅的方法可以

我想创建一个条形图,显示每月可用的对象数量。所有行都有开始和结束日期。我知道如何计算一个月的数量:

SELECT COUNT(*) As NumberOfItems
FROM Items
WHERE DATEPART(MONTH, Items.StartDate) <= @monthNumber 
AND DATEPART(MONTH, Items.EndDate) >= @monthNumber
现在,我想创建SQL,使用一个SELECT语句来获取月数和项数


有什么优雅的方法可以做到这一点吗?我知道我必须考虑年份号。

假设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)

注意:如果您打算跨越100个月以上,您需要在查询结束时选择maxrecursion 0。

因此,为了澄清我知道我必须考虑年份号,您是希望12行,而不管项目的日期范围是什么,还是希望如2011年3月和2012年3月作为不同的行?