2016-03-24 6 views
0

Ich habe eine Tabelle von Benutzern. Jeder Benutzer hat einen SubscriptionStartDate und SubscriptionEndDateWie aktive Teilnehmer zwischen zwei angegebenen Daten zählen

Das Enddatum null sein könnte, wenn ihr Abonnement hat

Ich brauche die Anzahl der aktiven Abonnements nicht geplant worden zu Ende Monat zählen über einen Zeitraum von Zeit

Ich kann dies einen Monat zu einer Zeit machen, aber ich möchte eine einzige Abfrage, die mir alle Ergebnisse auf einmal sagen kann, sagen wir jeden Monat in einem Jahr oder mehr.

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) 

Wie kann ich eine Abfrage oder CTE schreiben, um dies zu tun?

+0

Gibt es eine Möglichkeit festzustellen, ob der Benutzer den ganzen Monat aktiv war? –

+0

Angenommen, Abonnements enden erst am letzten Tag des Monats – stephen776

Antwort

1

Mit einem Zeitplan oder einem CTE und mit APPLY können Sie es auf diese Weise versuchen.

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

Beginnen Sie mit einer Tabelle oder einem CTE aller Monate in dem Bereich, den Sie überprüfen möchten, und treten Sie dieser Tabelle mithilfe der Abonnementdaten in der Benutzertabelle bei.

Verwandte Themen