select distinct userid,convert(varchar(10),date,120) as date,0 num into #T from @users order by 1,2
declare @A int,@B int,@d datetime
update #T set
@B = case when @A=userid and @d=cast([date] as datetime)-1 and convert(varchar(7),@d,120)=convert(varchar(7),cast([date] as datetime),120) then @B+1 else 1 end,
num = @B,
@A = userid,@d=[date]
select userid,dateadd(day,-(num-1),date) as date1,date date2,num into #S from #T
select * from #S a where not exists(select 1 from #S b where a.userid=b.userid and a.date1=b.date1 and a.date2<b.date2)
drop table #T,#S
--语句
select * ,[count] = (select count(1) from users where userid = t3.userid and date between begindate and enddate)
from
(
select userid,[date] as begindate,
[enddate] = (select min([date]) from users t1
where [date]>=t2.[date] and not exists(select 1 from users where userid = t1.userid and datediff(day,t1.[date],[date])=1)
)
from users t2
where not exists(select 1 from users where userid = t2.userid and datediff(day,[date],t2.[date])=1)
)t3
--环境
create table users
(
guid int identity(1,1) not null,
userid int,
date datetime
)
insert into users(userid,date) select 1,'2006-01-01'
insert into users(userid,date) select 1,'2006-01-03'
insert into users(userid,date) select 1,'2006-01-06'
insert into users(userid,date) select 1,'2006-01-10'
insert into users(userid,date) select 1,'2006-01-11'
insert into users(userid,date) select 1,'2006-01-12'
insert into users(userid,date) select 1,'2006-01-13'
insert into users(userid,date) select 1,'2006-01-18'
insert into users(userid,date) select 1,'2006-01-19'
insert into users(userid,date) select 1,'2006-01-20'
insert into users(userid,date) select 1,'2006-01-25'
insert into users(userid,date) select 1,'2006-01-26'
insert into users(userid,date) select 1,'2006-01-28'
insert into users(userid,date) select 1,'2006-01-29'
--语句
select userid,[date] as begindate,[enddate] = (select min([date]) from users t1
where [date]>=t2.[date] and not exists(select 1 from users where userid = t1.userid and datediff(day,t1.[date],[date])=1)
)
from users t2
where not exists(select 1 from users where userid = t2.userid and datediff(day,[date],t2.[date])=1)