无敌小贱
2013-04-20 17:47
采纳率: 0%
浏览 1.4k
已采纳

mysql统计登录次数或者在线时长

自然周内有3天登陆行为,或累计在线时长达到8小时以上
列名有lastLoginTime(登录时间),lastLogoutTime(退出时间)。这个东西怎么写啊?求大侠拔刀相助!!

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • Dead_Knight 2013-04-20 19:02
    已采纳

    自然周内有3天登陆行为,或累计在线时长达到8小时以上
    如果lastLoginTime(登录时间),lastLogoutTime(退出时间)这两个字段是在登录日志表中,那么查询sql为:
    1.自然周内有三天登录行为的:
    [code="java"]
    select weekNo,count(1) from (
    SELECT *,WEEK(lastLoginTime) weekNo FROM login_history
    ) t group by t.weekNo having count(1) > 3

    [/code]

    2.累计8小时:
    [code="java"]
    SELECT * FROM login_history WHERE TIMESTAMPDIFF(HOUR,lastLoginTime,lastLogoutTime) > 8
    [/code]

    如果不存在登录日志表,那么这两个字段根本没什么用处,仅仅知道上次登录时间、退出时间。

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • clxy大叔 2013-04-20 18:19

    只有lastLoginTime(登录时间),lastLogoutTime(退出时间)?last是最后的意思,如果只有一条最后的登录,推出时间,根本做不了的。

    是每天都可能有一条LoginTime(登录时间),LogoutTime(退出时间),或者有多条才好查询啊。

    评论
    解决 无用
    打赏 举报
  • jinnianshilongnian 2013-04-20 18:47

    1、自然周内有3天登陆行为: 这个建议去分析登录日志 而不是在程序中完成 比如 每天晚上去分析登录日志(记数据库性能差)

    2、或累计在线时长达到8小时以上
    2.1、是一次累计长达8小时
    2.2、还是总共累计长达8小时

    如果是2.1
    则可以根据lastLogoutTime - lastLoginTime 获取

    如果是2.2
    你的需求 在我的这个项目中是有的

    我的实现思路是每5分钟记录一下上次访问时间并在总的在线时间上+5分钟

    可以参考下
    userOnlineService.online(UserOnline.fromOnlineSession(session));

    [url]https://github.com/zhangkaitao/es/blob/master/web/src/main/java/org/apache/shiro/session/mgt/eis/OnlineSessionDAO.java[/url]

    评论
    解决 无用
    打赏 举报
  • clxy大叔 2013-04-20 19:07

    我假设

    1. 表里有多条登录,退出时间
    2. 登陆行为按lastLoginTime计算
    3. 不考虑跨周的特殊例子——比如周末登陆后,一直使用到下周一才退出。这种还是按登陆时间计算

    sql如下,参考下吧。
    [code="sql"]
    SELECT
    userid, 登录的自然周
    FROM
    (
    SELECT
    userid,
    UNIX_TIMESTAMP(lastLogoutTime)-UNIX_TIMESTAMP(lastLoginTime) AS 每次在线时间,
    WEEK(lastLoginTime) AS 登录的自然周
    FROM
    mytable
    )
    t
    GROUP BY
    userid, 登录的自然周
    HAVING
    (
    SUM(每次在线时间)>8*3600*1000 OR COUNT(1) >= 3
    )
    [/code]
    未测试

    评论
    解决 无用
    打赏 举报
  • 买房动力十足 2013-04-22 10:03

    自然周内有3天登陆行为,或累计在线时长达到8小时以上
    列名有lastLoginTime(登录时间),lastLogoutTime(退出时间)

    退出时间减去登陆时间 计算下,不就得出了本次的在线时间了嘛?》

    下次登陆的时候,再读取上次的登陆时间这样累加不就OK了。

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题