MySQL时间范围查询需选对DATETIME等字段类型,用>=/
在 MySQL 中实现时间范围查询,关键在于正确使用时间类型的字段(如 DATETIME、TIMESTAMP、DATE)并搭配合适的比较操作符和函数。项目中常见的时间字段如 created_at、updated_at、start_time、end_time,都可直接参与范围筛选。
MySQL 提供多种时间类型,用途不同:
DATE:只存日期(2025-05-20),适合记录生日、上线日等无时间点的场景DATETIME:存完整日期+时间(2025-05-20 14:30:00),不带时区,推荐用于业务主时间字段(如订单创建时间)TIMESTAMP:也存日期+时间,但自动转为 UTC 存储,读取时转回当前会话时区;有范围限制(1970–2038),适合需跨时区统一管理的场景(如日志时间)建议项目中统一用 DATETIME,避免隐式转换和时区干扰;建表时加上 DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP 可自动维护时间。
用 BETWEEN ... AND ... 或组合 >= 与 即可完成标准区间查询:
SELECT * FROM orders WHERE created_at >= '2025-05-01' AND created_at
注意:推荐用 替代 ,避免因秒级精度或微秒导致漏数据。
CURDATE() 返回日期,NOW() 返回完整时间):SELECT * FROM logs WHERE DATE(created_at) = CURDATE();
但注意:DATE() 函数会使 created_at 索引失效;更优写法是:
WHERE created_at >= CURDATE() AND created_at
借助 MySQL 日期函数可灵活计算边界:
WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) AND created_at
WHERE created_at >= DATE_FORMAT(DATE_S
这类写法可嵌入视图或预编译 SQL,便于复用。
时间范围查询是否高效,取决于索引是否生效:
(status, created_at) 支持 WHERE status=1 AND created_at >= ?)YEAR(created_at)=2025、DATE(created_at)),会导致索引失效WHERE created_at > ? ORDER BY created_at LIMIT 20 替代 OFFSET,减少扫描开销