日期:2014-05-18 浏览次数:20660 次
;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 行受影响)
*/