2016-03-24 13 views
0

Kullanıcılarım var. Her kullanıcı bir SubscriptionStartDate ve abonelik ben bir süre boyunca aylara göre aktif aboneliklerin sayısını saymak gerekirVerilen iki tarih arasında aktif aboneler nasıl sayılır?

sona ermesi planlanan edilmemiş ise Bitiş Tarihi boş olabilir

bir SubscriptionEndDate sahiptir

Bunu bir ayda bir yapabilirim, ancak bir yılda bir veya daha fazla her ay için bir kerede tüm sonuçları veren tek bir sorguyu istiyorum.

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) 

bu nasıl bir sorgu veya CTE yazabilirim yapmalı?

+0

Kullanıcının tüm ay boyunca etkin olup olmadığını tespit etmenin bir yolu var mı? –

+0

Aboneliklerin yalnızca ayın son günü sona erdiğini varsayalım. – stephen776

cevap

1

Zaman çizelgesi veya CTE ile ve APPLY ile bu şekilde deneyebilirsiniz.

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) 
0

Kontrol etmek istediğiniz aralıktaki tüm aylardan bir tablo veya CTE ile başlayın ve kullanıcı tablosundaki Abonelik tarihlerini kullanarak bu tabloya katılın.