You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写MySQL查询从含年月列的表中获取指定区间数据?

MySQL 查询指定年月区间内的数据

针对你的需求,这里提供几种实用的查询方案,适用于包含year(年份,数字型)、month(月份,1-12的数字型)、values列的表:

方案1:直接通过年月数值组合筛选(推荐,适合索引优化)

这种方式直接对year和month字段做数值比较,能有效利用(year, month)联合索引,性能更优。

假设你要查询2021年11月到2022年3月的数据,SQL语句如下:

SELECT *
FROM your_table_name
WHERE 
  (year > 2021 OR (year = 2021 AND month >= 11))
  AND
  (year < 2022 OR (year = 2022 AND month <= 3));

如果是用参数化查询(避免SQL注入),可以写成:

SELECT *
FROM your_table_name
WHERE 
  (year > ? OR (year = ? AND month >= ?))
  AND
  (year < ? OR (year = ? AND month <= ?));

参数依次传入:起始年、起始年、起始月、结束年、结束年、结束月。

方案2:拼接年月为日期后筛选(写法更简洁)

将year和month拼接成标准日期格式(比如2021-11-01),再通过日期范围筛选。注意这种写法如果没有函数索引,可能无法利用普通索引,数据量大时性能会受影响。

示例SQL:

SELECT *
FROM your_table_name
WHERE 
  STR_TO_DATE(CONCAT(year, '-', LPAD(month, 2, '0'), '-01'), '%Y-%m-%d')
  BETWEEN '2021-11-01' AND '2022-03-01';

这里用LPAD确保月份是两位(比如1月转成01),STR_TO_DATE把拼接后的字符串转成日期类型,再用BETWEEN匹配区间。

注意事项

  • 确保year是4位数字类型(比如2021而非21),month是1-12的数字类型;
  • 如果表数据量较大,建议给(year, month)创建联合索引,大幅提升查询速度;
  • 两种方案都会包含起始年月和结束年月的所有数据,符合区间查询的需求。

内容的提问来源于stack exchange,提问作者Pradeep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:05:27