MySQL中如何从varchar类型日期列筛选2018年5月的数据
解决MySQL中varchar类型日期的筛选问题(2018年5月数据)
嘿,我来帮你搞定这个需求!你的added_date字段是varchar类型,存的是mm/dd/yyyy格式的日期,要筛选2018年5月的数据,这里有两种实用的方法,看你需求选:
方法一:直接字符串匹配(简单快速)
因为你的日期格式是固定的mm/dd/yyyy,2018年5月的记录要么是5/xx/2018(月份是一位数),要么是05/xx/2018(月份是两位数),所以直接用字符串匹配就能搞定:
用LIKE语句的写法:
SELECT * FROM 你的表名 WHERE added_date LIKE '5/%/2018' OR added_date LIKE '05/%/2018';
要是想更简洁点,用正则表达式覆盖两种月份格式:
SELECT * FROM 你的表名 WHERE added_date REGEXP '^[0]?5/.*2018$';
这个正则的意思是:开头可以是可选的0,接着是5和斜杠,后面随便什么内容,最后以2018结尾,完美匹配所有2018年5月的记录。
方法二:转成日期类型筛选(更严谨)
如果担心表里有格式不规范的记录(比如偶尔写错的日期),那最好先把字符串转成日期类型再筛选,这样更靠谱:
用STR_TO_DATE函数把varchar转成日期,再提取年份和月份判断:
SELECT * FROM 你的表名 WHERE YEAR(STR_TO_DATE(added_date, '%m/%d/%Y')) = 2018 AND MONTH(STR_TO_DATE(added_date, '%m/%d/%Y')) = 5;
也可以用日期范围来筛选,要是以后把字段改成DATE类型,这种写法还能利用索引提升效率:
SELECT * FROM 你的表名 WHERE STR_TO_DATE(added_date, '%m/%d/%Y') BETWEEN '2018-05-01' AND '2018-05-31';
这里要注意,STR_TO_DATE里的%m对应两位数月份,%d是两位数日期,%Y是四位数年份,哪怕你的月份是一位数,这个函数也能正确转换。
额外小建议
如果这个表经常要做日期相关的查询,建议把added_date改成DATE类型,这样不仅查询效率更高,还能避免格式错误的问题。修改语句如下:
ALTER TABLE 你的表名 MODIFY COLUMN added_date DATE;
不过改之前最好先检查一下有没有格式错误的记录,避免转换失败:
SELECT added_date FROM 你的表名 WHERE STR_TO_DATE(added_date, '%m/%d/%Y') IS NULL;
内容的提问来源于stack exchange,提问作者Bangla Tiger
相关产品推荐
相关产品推荐

