如何计算两个给定日期之间的活跃订阅者

时间:2016-03-24 16:04:40

标签: sql sql-server sql-server-2008 tsql sql-server-2008-r2

我有一张用户表。每个用户都有一个SubscriptionStartDate和一个SubscriptionEndDate

如果他们的订阅尚未安排结束,则结束日期可以为空

我需要在一段时间内按月计算有效订阅的数量

我可以一次这样做一个月,但我希望一个查询可以一次性给我所有结果,比如每年一个月或更长时间。

declare @startDate datetime;
declare @endDate datetime;

set @startDate = '2-01-2016';
set @endDate = '2-29-2016'

select COUNT(*)
from Users
where SubscriptionStartDate <= @startDate
and (SubscriptionEndDate is null or SubscriptionEndDate>= @endDate)

如何编写查询或CTE来执行此操作?

2 个答案:

答案 0 :(得分:1)

使用时间表或CTE并使用APPLY,您可以这样尝试。

with months AS (
    select CONVERT(DATE,'2015-01-01') MonthStart, CONVERT(DATE,'2015-01-31') MonthEnd
    union all
    select dateadd(MONTH,1,MonthStart), dateadd(DAY,-1,dateadd(MONTH,2,MonthStart))
    from months
    where
        dateadd(MONTH,1,MonthStart) < GETDATE()
)
select 
    * 
from months m 
outer apply (
    select
        COUNT(*) UserCount
    from [Users] [U]
    where
        SubscriptionStartDate <= m.MonthEnd and
        (ISNULL(SubscriptionEndDate,'3000-01-01')>= m.MonthStart)
) Users
OPTION (MAXRECURSION 0)

答案 1 :(得分:0)

从您要检查的范围内的所有月份的表格或CTE开始,并使用用户表格中的订阅日期加入该表格。