-3

我有一个表,其中包含有效日期和到期日期等列。给定日期范围,我需要计算该日期范围内每个月有多少活动。任何想法如何做到这一点?

编辑:似乎很多人都忽略了问题的重点。这不是一个简单的 where 查询。我的记录具有不同的生效日期和到期日期。我想运行一个查询,给定日期范围,它返回给我的计数,对于给定范围内的每个月,记录数。因此,如果我给它提供从 2012 年 8 月到 2013 年 8 月的日期范围,它需要给我每个月的信息,根据有效日期和到期日期记录活跃的地方。

数据示例

EffDt          ExpDt        Id
08/01/2012     10/01/2012   1
08/01/2012     09/31/2012   2
10/01/2012     01/01/2013   3
11/01/2012     08/01/2013   4
01/01/2013     09/01/2013   5

if the date range is  07/01/2012 - 05/01/2013 I should get

Date         Count
07-2012      0        - there are  no active records in 07-2012
08-2012      2        - id 1 and 2 are active in 08-2012
09-2012      2        - id 1,2 are active in 09-2012
10-2012      2        - id 1,3 are active but 2 is no longer active in 10-2012
11-2012      3        - id 1,3,4 are now active, 2 is not longer active
12-2012      3
01-2013      4
02-2013      3        - id 3 is now no longer active
03-2013      3
04-2013      3
05-2013      3
4

1 回答 1

3

获得此结果的最简单方法是创建带有日期的日历表,然后您可以将日历表连接到当前表以确定日期范围内的内容。

如果您没有日历表,则可以使用递归 CTE 生成日期列表:

;with cte (dt) as
(
  select cast('2012-07-01' as date)
  union all
  select dateadd(m, 1, dt)
  from cte
  where dateadd(m, 1, dt) <= '2013-05-01'
)
select dt
from cte

请参阅SQL Fiddle with Demo

您可以使用此 CTE 连接到您的表并获取范围内每一行的计数:

;with cte (dt) as
(
  select cast('2012-07-01' as date)
  union all
  select dateadd(m, 1, dt)
  from cte
  where dateadd(m, 1, dt) <= '2013-05-01'
)
select c.dt, count(t.id) TotalCount
from cte c
left join yourtable t
  on c.dt >= t.effdt 
  and c.dt <= t.expdt
group by c.dt

请参阅带有演示的 SQL Fiddle

于 2013-06-18T18:10:38.103 回答