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

MySQL使用STR_TO_DATE转换日期年份固定为2020如何解决?

问题根因

你出现年份转换错误的核心原因是用错了年份格式符:

  • MySQL中%y是两位年份匹配符,仅会读取2位字符作为年份值,你的输入字符串是4位完整年份,按照%d-%m-%y解析时,系统会取年份段的前2位20作为年份值,按照规则00-69的两位年份默认归属2000-2069区间,所以得到了2020,这就是月日转换正常但年份错误的原因。
  • 匹配4位完整年份需要使用大写的%Y格式符。
修复方法

将格式串中的%y替换为%Y即可得到正确转换结果:

  1. 数字月份格式转换示例:
SELECT STR_TO_DATE('14-09-2017','%d-%m-%Y') AS formatted_date;

返回结果:2017-09-14

  1. 英文缩写月份格式转换示例:
SELECT STR_TO_DATE('20-MAR-2018','%d-%b-%Y') AS formatted_date;

返回结果:2018-03-20

注意:你的列名ORDER DATE包含空格,查询时需要用反引号包裹避免语法错误。

更优的日期处理方案
  1. 长期最优方案:将列类型从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;
  1. 临时查询方案:如果暂时无法修改表结构,查询时可直接转换得到目标格式:
SELECT DATE_FORMAT(STR_TO_DATE(`ORDER DATE`, '%d-%m-%Y'), '%Y-%m-%d') AS order_date FROM 你的表名;

内容的提问来源于stack exchange,提问作者Sudip Narayan Choudhury

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:06:04