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

MySQL按指定年月筛选日期范围遇异常:查询无结果求解决方法

问题分析与解决方法

首先来说说你哪里出错了:
你的筛选条件BETWEEN CONCAT('2019', '-', '01') AND CONCAT('2019', '-', '05')存在两个关键问题:

  • 如果你prod_date是DATE/DATETIME类型:MySQL会自动把'2019-01'和'2019-05'解析为日期'2019-01-01'和'2019-05-01',这意味着你的筛选范围只覆盖到2019年5月1日0点,5月2日到5月31日的所有日期都被排除在外。如果你的表中1-4月没有数据,只有5月1日之后的记录,自然返回空结果。
  • 如果你prod_date是字符串类型:字符串比较是按字符顺序逐位对比的,'2019-05'(长度7)和'2019-05-01'(长度10)对比时,MySQL会用空格填充短字符串到相同长度,这时候'2019-05 '会小于'2019-05-01',所以所有5月的日期字符串都会大于'2019-05',同样无法被筛选出来。

接下来给你几种可靠的按年月筛选的方法:

方法一:明确日期范围(推荐DATE类型使用)

直接指定筛选的起始日期和结束日期,确保覆盖整个5月:

SELECT * FROM mytbl 
WHERE prod_date BETWEEN '2019-01-01' AND '2019-05-31';

如果想更灵活(比如不用手动计算月末日期),可以用LAST_DAY()函数自动获取当月最后一天:

SELECT * FROM mytbl 
WHERE prod_date >= '2019-01-01' 
  AND prod_date <= LAST_DAY('2019-05-01');

方法二:提取年月进行比较(逻辑最直观)

使用YEAR()和MONTH()函数提取日期的年份和月份,直接筛选1-5月:

SELECT * FROM mytbl 
WHERE YEAR(prod_date) = 2019 
  AND MONTH(prod_date) BETWEEN 1 AND 5;

如果prod_date是字符串类型,需要先转换成日期:

SELECT * FROM mytbl 
WHERE YEAR(STR_TO_DATE(prod_date, '%Y-%m-%d')) = 2019 
  AND MONTH(STR_TO_DATE(prod_date, '%Y-%m-%d')) BETWEEN 1 AND 5;

方法三:字符串前缀匹配(适合字符串类型日期)

因为你的日期格式是2019-xx-xx,可以用LEFT()函数提取前7位(即YYYY-MM)来筛选:

SELECT * FROM mytbl 
WHERE LEFT(prod_date, 7) BETWEEN '2019-01' AND '2019-05';

这个方法对DATE类型也适用,因为MySQL会自动把DATE类型转换为YYYY-MM-DD格式的字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:09:48