如何正确查询数据库datetime类型字段对应时间前30分钟的记录
现有SQL存在的问题
- 时间计算逻辑错误:
DATE_SUB(NOW(), INTERVAL -30 MINUTE)实际得到的是当前时间往后加30分钟的时间点,和你需要的「往前推30分钟」需求完全相反。DATE_SUB本身就是做减法,不需要给时间间隔加负号,加负号相当于变成加法。 - 匹配逻辑错误:用
=做精确匹配只能命中刚好等于对应时间点那一秒的记录,你要的是过去30分钟内的所有记录,应该用范围匹配而非等值匹配。 - 多余的字段处理导致索引失效:
start本身就是datetime类型,不需要用DATE_FORMAT做格式化,给字段加函数会导致数据库无法命中start字段的索引,数据量大时查询效率会非常低。
正确写法
如果要查询最近30分钟内的所有记录,推荐直接用范围匹配,能正常走字段索引:
SELECT id FROM tbl_events WHERE start >= DATE_SUB(NOW(), INTERVAL 30 MINUTE);
如果业务需要排除当前时间之后的未来记录,可以增加边界限制:
SELECT id FROM tbl_events WHERE start BETWEEN DATE_SUB(NOW(), INTERVAL 30 MINUTE) AND NOW();
内容的提问来源于stack exchange,提问作者Will W
相关产品推荐
相关产品推荐

