如何根据用户输入的月份和年份查询MySQL对应日期数据生成月度报表
MySQL按指定年月筛选日期数据的实现方案
方案1:性能最优(推荐)
不对表字段做函数运算,可命中日期字段的索引,适合数据量较大的业务场景:
SELECT * FROM 你的表名 WHERE 日期字段 >= STR_TO_DATE(CONCAT(?, '-', ?, '-01'), '%Y-%m-%d') AND 日期字段 < DATE_ADD(STR_TO_DATE(CONCAT(?, '-', ?, '-01'), '%Y-%m-%d'), INTERVAL 1 MONTH);
?按顺序分别绑定用户提交的年份、月份、年份、月份参数即可。
方案2:简易实现
写法更简洁,适合数据量较小、日期字段未建索引的场景:
SELECT * FROM 你的表名 WHERE YEAR(日期字段) = ? AND MONTH(日期字段) = ?
?按顺序分别绑定用户提交的年份、月份参数即可。
特殊场景兼容
如果你的日期字段实际为VARCHAR类型,存储的是%d-%m-%Y格式的字符串,需要先用STR_TO_DATE转成日期类型再筛选:
-- 简易写法示例 SELECT * FROM 你的表名 WHERE YEAR(STR_TO_DATE(日期字段, '%d-%m-%Y')) = ? AND MONTH(STR_TO_DATE(日期字段, '%d-%m-%Y')) = ?
注意事项
- 提前校验用户提交的参数合法性:月份取值范围为1-12,年份为合法的数值格式
- 所有动态参数请使用预编译绑定,不要直接拼接SQL字符串,避免SQL注入风险
内容的提问来源于stack exchange,提问作者Tammam Wardi
相关产品推荐
相关产品推荐

