Query Builder中15分钟在线用户筛选SQL逻辑bug排查求助
问题分析与修复方案
核心bug:比较符号完全写反了
你要筛选15分钟内登录的在线用户,逻辑应该是「用户最后登录时间晚于等于当前时间往前推15分钟」,但你写的<是反过来的——它会筛选出15分钟之前就登录过的用户,这就是为什么会返回所有已登录用户的原因。
逐个解答你的疑问:
- 比较符号错误? 对,这就是根本问题,把
<改成>=(或>,看业务是否要包含刚好15分钟前的用户)就解决了。 - NOW()未获取最新时间戳? 没问题,
NOW()会取SQL执行瞬间的当前时间戳,这个用法是对的。 - '15'字符串格式问题? 也没问题,从语法看你用的是PostgreSQL,它支持
INTERVAL '15' MINUTE这种写法,引号不影响功能。
修正后的代码与SQL
修正后的代码片段:
if (Boolean.parse(isOnline)) { filterConditions += ` AND u.lastLoginAt >= NOW() - INTERVAL '15' MINUTE`; }
修正后的完整SQL:
SELECT u.* FROM application.users_tbl u WHERE u.role = 'user' AND u.lastLoginAt >= NOW() - INTERVAL '15' MINUTE ORDER BY u.createdAt DESC;
注:如果业务要求严格排除刚好15分钟前登录的用户,把
>=改成>即可。
内容的提问来源于stack exchange,提问作者The Old County
相关产品推荐
相关产品推荐

