跨月查询应直接用日期字段比较,避免年月字符串拼接;推荐使用BETWEEN或>=、= '2024-02-15 00:00:00' AND create_time

跨月查询的核心是让时间条件不被月份边界卡住,关键在于用日期字段直接比较,而不是依赖年月字符串拼接或截取。
用BETWEEN或>=
最稳妥的方式是明确指定开始和结束的完整时间点,数据库会自动处理跨月逻辑:
- 查2024年2月15日到2024年3月10日的数据:
WHERE create_time >= '2024-02-15 00:00:00' AND create_time - 注意:用
避免用YEAR()、MONTH()函数做条件
这类函数会让索引失效,查询变慢,尤其数据量大时明显:
- ❌ 不推荐:WHERE YEAR(create_time) = 2024 AND MONTH(create_time) IN (2,3)
- ✅ 推荐:用范围查询替代,哪怕跨年也一样处理,例如查2023年11月到2024年1月:
WHERE create_time >= '2023-11-01' AND create_time
动态计算跨月范围(适合报表或参数化查询)
如果起止时间来自变量或需要按自然月滚动,可用日期函数生成边界:
- 查上个月到本月15号的数据:
WHERE create_time >= DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), '%Y-%m-01')
AND create_time - 更简洁写法(MySQL):
WHERE create_time >= LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 2 MONTH)) + INTERVAL 1 DAY
AND create_time
时区和字段类型要对齐
容易出错但常被忽略的点:
- 如果create_time是DATETIME类型,就别和DATE类型直接比,显式转成同类型,比如:
WHERE DATE(create_time) BETWEEN '2024-02-15' AND '2024-03-10'(但会丢索引) - 服务器时区、应用层传入时间、数据库时区不一致时,先统一用UTC或固定时区存取,再查
- 用TIMESTAMP字段要注意它自动转时区,比较前确认值是否已按预期存储










