MySQL使用STR_TO_DATE转换日期年份固定为2020如何解决?
问题根因
你出现年份转换错误的核心原因是用错了年份格式符:
- MySQL中
%y是两位年份匹配符,仅会读取2位字符作为年份值,你的输入字符串是4位完整年份,按照%d-%m-%y解析时,系统会取年份段的前2位20作为年份值,按照规则00-69的两位年份默认归属2000-2069区间,所以得到了2020,这就是月日转换正常但年份错误的原因。 - 匹配4位完整年份需要使用大写的
%Y格式符。
修复方法
将格式串中的%y替换为%Y即可得到正确转换结果:
- 数字月份格式转换示例:
SELECT STR_TO_DATE('14-09-2017','%d-%m-%Y') AS formatted_date;
返回结果:2017-09-14
- 英文缩写月份格式转换示例:
SELECT STR_TO_DATE('20-MAR-2018','%d-%b-%Y') AS formatted_date;
返回结果:2018-03-20
注意:你的列名ORDER DATE包含空格,查询时需要用反引号包裹避免语法错误。
更优的日期处理方案
- 长期最优方案:将列类型从text改为DATE类型
文本存储日期会存在格式不统一、无法使用日期索引、缺乏数据校验等问题,建议直接修改列类型:
-- 先将所有文本值转换为标准日期格式,如有英文月份请将格式串替换为'%d-%b-%Y' UPDATE 你的表名 SET `ORDER DATE` = STR_TO_DATE(`ORDER DATE`, '%d-%m-%Y'); -- 修改列数据类型为DATE,后续存储会自动按照yyyy-mm-dd标准格式处理 ALTER TABLE 你的表名 MODIFY COLUMN `ORDER DATE` DATE;
- 临时查询方案:如果暂时无法修改表结构,查询时可直接转换得到目标格式:
SELECT DATE_FORMAT(STR_TO_DATE(`ORDER DATE`, '%d-%m-%Y'), '%Y-%m-%d') AS order_date FROM 你的表名;
内容的提问来源于stack exchange,提问作者Sudip Narayan Choudhury
相关产品推荐
相关产品推荐

