You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL查询RADIUS数据库中一周以上未登录用户的方法

搞定RADIUS数据库里超过一周未登录用户的查询问题

嘿,看你已经做了初步测试,第一次查到了正确的waljo,6824结果,但后来用相同查询好像出状况了?先给你梳理下靠谱的查询逻辑,再聊聊可能踩的坑。

核心查询语句

首先,咱们得明确:判断用户最后一次登录的时间,应该以stoptime(最后注销时间)为准——毕竟这是用户上次登录结束的时间。如果是已经停用的用户(比如你的测试用户waljo),他的stoptime应该停在去年5月。

要筛选出超过一周没登录的用户,就是找那些最后注销时间距离现在超过7天的记录。基础查询可以这么写:

SELECT username, TIMESTAMPDIFF(DAY, stoptime, NOW()) AS days_since_last_login
FROM radacct  -- 这里替换成你实际的RADIUS表名,一般是radacct
WHERE stoptime < DATE_SUB(NOW(), INTERVAL 7 DAY)
ORDER BY days_since_last_login DESC;

要是存在用户stoptime为NULL的情况(比如用户一直在线但实际已经停用),咱们得把这种情况也考虑进去,避免漏查:

SELECT username, 
       CASE 
           WHEN stoptime IS NULL THEN TIMESTAMPDIFF(DAY, starttime, NOW())
           ELSE TIMESTAMPDIFF(DAY, stoptime, NOW())
       END AS days_since_last_login
FROM radacct
WHERE (stoptime < DATE_SUB(NOW(), INTERVAL 7 DAY) OR 
      (stoptime IS NULL AND starttime < DATE_SUB(NOW(), INTERVAL 7 DAY)))
ORDER BY days_since_last_login DESC;

为啥重复查询结果不对?

你说第一次查对了,后来就不行了,大概率是这几个原因:

  • 时区不匹配:MySQL的时区设置和RADIUS服务器的时区不一样,导致NOW()计算的当前时间有偏差。可以跑SELECT @@time_zone;看看时区,确保和RADIUS服务的时区一致。
  • 数据被改动了:会不会有人误操作把waljo的stoptime更新了?比如不小心重新激活了用户,或者RADIUS服务自动生成了新的记录?
  • 查询缓存搞的鬼:如果MySQL开了查询缓存,可能返回的是旧的缓存结果。你可以在查询前加SQL_NO_CACHE,比如SELECT SQL_NO_CACHE username...,绕过缓存再测试。
  • 没处理NULL值:如果你的原始查询没考虑stoptime为NULL的情况,后续查询遇到这类用户时,结果就会乱掉。

验证测试用户的小技巧

针对你的测试用户waljo,单独查他的记录,就能快速定位问题:

SELECT username, starttime, stoptime, TIMESTAMPDIFF(DAY, stoptime, NOW()) AS days_since_last_login
FROM radacct
WHERE username = 'waljo';

看看他的stoptime是不是还停在去年5月,天数计算对不对,一下子就能找到问题所在。

内容的提问来源于stack exchange,提问作者Shawn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:36:02