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
相关产品推荐
相关产品推荐

