T-SQL:如何计算属于给定日期范围的记录?

时间:2013-06-18 16:35:35

标签: tsql

我有一个表,其中包括有效期和失效期。鉴于日期范围,我需要计算该日期范围内每个月的活跃数量。任何想法如何做到这一点?

编辑: 似乎许多人都忽略了问题的重点。查询不是一个简单的地方。我的记录具有不同的有效期和到期日。我想运行一个查询,给定日期范围,它返回给定范围内每个月的计数,记录数。因此,如果我在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

1 个答案:

答案 0 :(得分: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 with Demo