比如我要根据今天的时间来查询用户或某个用户这7天来是否有连续登陆。

解决方案 »

  1.   


    create table loginlog(logintime datetime,u_id int)insert into loginlog select '2011-12-16',907
    insert into loginlog select '2011-12-17',907
    insert into loginlog select '2011-12-18',907
    insert into loginlog select '2011-12-14',1100
    insert into loginlog select '2011-12-15',1100
    insert into loginlog select '2011-12-16',1100
    insert into loginlog select '2011-12-13',1200
    insert into loginlog select '2011-12-14',1200
    insert into loginlog select '2011-12-16',1200
    insert into loginlog select '2011-12-17',1200
    insert into loginlog select '2011-12-18',1200
    go
    那就实现连续3天的吧 比如说如果现在时间是2011-12-18 那么结果就显示用户907和1200
    如果现在时间是2011-12-16 那么结果就显示用户1100
      

  2.   

    一个笨方法
    create table #loginlog(logintime datetime,u_id int)insert into #loginlog select '2011-12-16',907
    insert into #loginlog select '2011-12-17',907
    insert into #loginlog select '2011-12-18',907
    insert into #loginlog select '2011-12-14',1100
    insert into #loginlog select '2011-12-15',1100
    insert into #loginlog select '2011-12-16',1100
    insert into #loginlog select '2011-12-13',1200
    insert into #loginlog select '2011-12-14',1200
    insert into #loginlog select '2011-12-16',1200
    insert into #loginlog select '2011-12-17',1200
    insert into #loginlog select '2011-12-18',1200
    go
    declare @date datetime
    SET @date='2011-12-16'
    select a.u_id from #loginlog a
    join (select u_id  from #loginlog where logintime=DATEADD(D,-1,@date))b on b.u_id=a.u_id
    join (select u_id  from #loginlog where logintime=DATEADD(D,-2,@date))c on c.u_id=a.u_id
    where logintime=@date 
    drop table #loginlog
      

  3.   

    谢谢了,这个方法也不错啊,不过我现在需要sql语句实现的,再加点小要求把,最好还能显示统计连续登陆的次数。比如之前说的:现在时间是2011-12-18 那么结果就显示用户907和连续登陆了3次、用户1200和连续登陆4次,并且是按登陆次数降序的,有劳各位了!!create table #loginlog(logintime datetime,u_id int)insert into #loginlog select '2011-12-16',907
    insert into #loginlog select '2011-12-17',907
    insert into #loginlog select '2011-12-18',907
    insert into #loginlog select '2011-12-14',1100
    insert into #loginlog select '2011-12-15',1100
    insert into #loginlog select '2011-12-16',1100
    insert into #loginlog select '2011-12-13',1200
    insert into #loginlog select '2011-12-15',1200
    insert into #loginlog select '2011-12-16',1200
    insert into #loginlog select '2011-12-17',1200
    insert into #loginlog select '2011-12-18',1200
    go
      

  4.   

    create table loginlog(logintime datetime,u_id int)insert into loginlog select '2011-12-16',907
    insert into loginlog select '2011-12-17',907
    insert into loginlog select '2011-12-18',907
    insert into loginlog select '2011-12-14',1100
    insert into loginlog select '2011-12-15',1100
    insert into loginlog select '2011-12-16',1100
    insert into loginlog select '2011-12-13',1200
    insert into loginlog select '2011-12-14',1200
    insert into loginlog select '2011-12-16',1200
    insert into loginlog select '2011-12-17',1200
    insert into loginlog select '2011-12-18',1200
    go
    /*
    那就实现连续3天的吧 比如说如果现在时间是2011-12-18 那么结果就显示用户907和1200
    如果现在时间是2011-12-16 那么结果就显示用户1100
    */select distinct u_id from loginlog
    where logintime between convert(varchar(10),DATEADD(DD,-3,'2011-12-18'),120) 
    and CONVERT(varchar(10),'2011-12-18',120)
    group by u_id
    having COUNT(*)>=3/*
    u_id
    907
    1200
    */
      

  5.   


    如果是根据今天,就直接把我指定的那个时间换成getdate()就好了
    我这里是方便测试
      

  6.   

    谢谢,请问怎么实现加个显示连续登陆次数啊:如果现在时间是2011-12-18 那么结果就显示用户907和连续登陆了3次、用户1200和连续登陆4次,并且是按登陆次数降序的,麻烦各位了!!create table #loginlog(logintime datetime,u_id int)insert into #loginlog select '2011-12-16',907
    insert into #loginlog select '2011-12-17',907
    insert into #loginlog select '2011-12-18',907
    insert into #loginlog select '2011-12-14',1100
    insert into #loginlog select '2011-12-15',1100
    insert into #loginlog select '2011-12-16',1100
    insert into #loginlog select '2011-12-13',1200
    insert into #loginlog select '2011-12-15',1200
    insert into #loginlog select '2011-12-16',1200
    insert into #loginlog select '2011-12-17',1200
    insert into #loginlog select '2011-12-18',1200
    go
      

  7.   

    谢谢了,那请问怎么实现再显示个连续登陆次数啊:比如现在时间是2011-12-18 那么结果就显示用户907和连续登陆了3次、用户1200和连续登陆4次,并且是按登陆次数降序的,麻烦各位了!!create table #loginlog(logintime datetime,u_id int)insert into #loginlog select '2011-12-16',907
    insert into #loginlog select '2011-12-17',907
    insert into #loginlog select '2011-12-18',907
    insert into #loginlog select '2011-12-14',1100
    insert into #loginlog select '2011-12-15',1100
    insert into #loginlog select '2011-12-16',1100
    insert into #loginlog select '2011-12-13',1200
    insert into #loginlog select '2011-12-15',1200
    insert into #loginlog select '2011-12-16',1200
    insert into #loginlog select '2011-12-17',1200
    insert into #loginlog select '2011-12-18',1200
    go
      

  8.   

    select distinct u_id,count(*) as 连续登陆次数 from loginlog
    where logintime between convert(varchar(10),DATEADD(DD,-3,'2011-12-18'),120) 
    and CONVERT(varchar(10),'2011-12-18',120)
    group by u_id
    having COUNT(*)>=3
      

  9.   


    create table #loginlog(logintime datetime,u_id int)insert into #loginlog select '2011-12-16',907
    insert into #loginlog select '2011-12-17',907
    insert into #loginlog select '2011-12-18',907
    insert into #loginlog select '2011-12-14',1100
    insert into #loginlog select '2011-12-15',1100
    insert into #loginlog select '2011-12-16',1100
    insert into #loginlog select '2011-12-13',1200
    insert into #loginlog select '2011-12-15',1200
    insert into #loginlog select '2011-12-16',1200
    insert into #loginlog select '2011-12-17',1200
    insert into #loginlog select '2011-12-18',1200
    go
    --同一个帐号,连续登陆的天数  
    ;WITH cte AS
    (
        SELECT b.u_id,CONVERT(CHAR(8),DATEADD(day,-sn,logintime),112)AS dn,COUNT(1) AS counts
         FROM 
        (
            SELECT u_id,ROW_NUMBER()OVER(PARTITION BY u_id ORDER BY logintime) AS sn,logintime
            FROM #loginlog
        )AS b
        GROUP BY b.u_id,CONVERT(CHAR(8),DATEADD(day,-sn,b.logintime),112)
    )
    SELECT * FROM cteu_id        dn       counts
    ----------- -------- -----------
    1200        20111212 1
    1100        20111213 3
    1200        20111213 4
    907         20111215 3(4 行受影响)
      

  10.   


    create table #loginlog(logintime datetime,u_id int)insert into #loginlog select '2011-12-16',907
    insert into #loginlog select '2011-12-17',907
    insert into #loginlog select '2011-12-18',907
    insert into #loginlog select '2011-12-14',1100
    insert into #loginlog select '2011-12-15',1100
    insert into #loginlog select '2011-12-16',1100
    insert into #loginlog select '2011-12-13',1200
    insert into #loginlog select '2011-12-15',1200
    insert into #loginlog select '2011-12-16',1200
    insert into #loginlog select '2011-12-17',1200
    insert into #loginlog select '2011-12-18',1200
    go
    --同一个帐号,连续登陆的天数  
    ;WITH cte AS
    (
        SELECT b.u_id,CONVERT(CHAR(8),DATEADD(day,-sn,logintime),112)AS dn,COUNT(1) AS counts
         FROM 
        (
            SELECT u_id,ROW_NUMBER()OVER(PARTITION BY u_id ORDER BY logintime) AS sn,logintime
            FROM #loginlog
        )AS b
        GROUP BY b.u_id,CONVERT(CHAR(8),DATEADD(day,-sn,b.logintime),112)
    )
    SELECT * FROM cte where counts>7--鸭子,你又结贴了u_id        dn       counts
    ----------- -------- -----------
    1200        20111212 1
    1100        20111213 3
    1200        20111213 4
    907         20111215 3(4 行受影响)
      

  11.   


    你的还是有点问题呀,DATEADD(DD,-3,'2011-12-18')这里的DD如果大于-5结果就会显示连续登陆次数为5啊,虽然是5天,但是13和15不连续啊,应该还是显示次数为4的吧
    insert into #loginlog select '2011-12-13',1200
    insert into #loginlog select '2011-12-15',1200
    insert into #loginlog select '2011-12-16',1200
    insert into #loginlog select '2011-12-17',1200
    insert into #loginlog select '2011-12-18',1200