如何解决查找给定日期的数据
| 我有一个表,用于存储用户记录 这包括列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:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。