查找给定日期的数据

问题描述

| 我有一个表,用于存储用户记录 这包括
username
FromDate
ToDate
Status
我有一个需求,我需要在
1 Dec 2010
1 April 2011
上找到活动用户(状态)的数量。 换句话说,我们试图确定在
1 Dec 2010
1 Apr 2011
上有多少用户处于活动状态,以便我们可以比较添加/丢失了多少个用户。 如何才能做到这一点?     

解决方法

        在12月1日和4月1日都处于活动状态的用户:
with cte
as
(
    select UserName,FromDate,ToDate
    from MyTable
    where Status = \'Active\' -- adjust to your status type
)
select distinct UserName
from cte
where 
    FromDate < \'20101202\' 
    and ToDate >= \'20101201\' and
    UserName in
    (
        select *
        from cte
        where FromDate < \'20110402\' and ToDate >= \'20110401\'
    )
要查看添加了哪些用户以及删除了哪些用户,您可以执行以下操作:
with cte
as
(
    select UserName,ToDate
    from MyTable
    where Status = \'Active\' -- adjust to your status type
)
select UserName,sum(WasActiveOnDecFirst) WasActiveOnDecFirst,sum(WasActiveOnAprFirst) WasActiveOnAprFirst
from
(
    select 
        isnull(du.UserName,au.UserName) UserName,case when du.UserName is null then 0 else 1 end WasActiveOnDecFirst,case when au.UserName is null then 0 else 1 end WasActiveOnAprFirst
    from
    (
        select distinct UserName
        from cte
        where FromDate < \'20101202\' and ToDate >= \'20101201\'
    ) du
        full join
    (
        select distinct UserName
        from cte
        where FromDate < \'20110402\' and ToDate >= \'20110401\'
    ) au
        on du.UserName = au.UserName
) tt
group by UserName
with rollup
结果将如下所示:
UserName             WasActiveOnDecFirst WasActiveOnAprFirst
-------------------- ------------------- -------------------
user1                1                   1
user2                1                   1
user3                1                   1
user4                0                   1
NULL                 3                   4
最后一行是用户总数。     ,        
declare @FromDate date = \'20101201\'
declare @ToDate   date = \'20110401\'

select
  count(case when @FromDate between FromDate and ToDate then 1 end) as CountFromDate,count(case when @ToDate   between FromDate and ToDate then 1 end) as CountToDate
from YourTable
where FromDate <= @ToDate and
      ToDate >= @FromDate and
      Status = 1  
    ,        编辑:请参阅Mikael Eriksson提供的答案。它看起来比我编写的查询要好得多。 如果只有两个日期可以比较,则可以执行以下操作。屏幕快照#1显示了针对样本数据的以下给定查询的输出。用户
1
4
6
9
2010-12-01
上处于活动状态。用户
1
3
4
5
7
8
2011-04-01
上处于活动状态。因此,计数4和6。 。
DECLARE @Date1  DATETIME
DECLARE @Date2  DATETIME

SET @Date1 = \'2010-12-01\'
SET @Date2 = \'2011-04-01\'

    SELECT  @Date1          AS AsOnDate,COUNT(Username) AS ActiveCount
    FROM    dbo.Users
    WHERE   @Date1 BETWEEN FromDate AND ToDate
UNION
    SELECT  @Date2          AS AsOnDate,COUNT(Username) AS ActiveCount
    FROM    dbo.Users
    WHERE   @Date2 BETWEEN FromDate AND ToDate
希望能有所帮助。 屏幕截图1: