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
相关产品推荐
相关产品推荐

