日期:2014-05-18 浏览次数:20656 次
;with t
as(
SELECT ROW_NUMBER() OVER ( PARTITION BY u_id ORDER BY CONVERT(VARCHAR(10), logintime, 120) ) AS rownum ,
*
FROM ( SELECT u_id ,
MAX(CONVERT(VARCHAR(10), logintime, 120)) AS logintime
FROM loginlog
GROUP BY u_id ,
CONVERT(VARCHAR(10), logintime, 120)
) a
),
m
as(
select u_id,logintime,DATEADD(DD,-rownum,logintime) as diff from t
)
SELECT * ,
( DATEDIFF(DD, startdate, endtime) + 1 ) AS [days]
FROM ( SELECT u_id ,
MIN(logintime) AS startdate ,
MAX(logintime) AS endtime
FROM m
GROUP BY u_id ,
diff
) a
WHERE DATEDIFF(DD, startdate, endtime) >= 2
AND endtime =CONVERT(VARCHAR(10),GETDATE(),120) --这个地方限定一下即可。
ORDER BY 1
------解决方案--------------------
declare @date datetime = '2011-04-10'; -- 11年的今天?
with cte as
(
select *, err=row_number()over(partition by u_id order by logintime desc)-datediff(day,logintime,@date) from loginlog
)
select u_id, min(logintime), max(logintime), count(1) from cte where err=0 group by u_id
/*
u_id
----------- ----------------------- ----------------------- -----------
1100 2011-04-07 00:00:00.000 2011-04-09 00:00:00.000 3
1200 2011-04-07 00:00:00.000 2011-04-09 00:00:00.000 3
(2 行受影响)
*/