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

如何设置SQL日期格式为12th Jun 2021样式并解决CSV导入日期异常

解决LOAD DATA导入带序数词日期的问题

一、导入时修复日期格式(核心解决方案)

你的CSV日期格式是1st Jan 2021这种带序数词后缀(st/nd/rd/th)的格式,MySQL默认无法直接识别,导致导入后变成0000-00-00。需要在导入过程中先清理后缀,再转换为DATE类型:

  1. 先设置会话时区语言为英文(确保能识别Jan/Feb等英文月份缩写):
SET lc_time_names = 'en_US';
  1. 使用LOAD DATA时,通过用户变量接收原始日期字符串,清理后缀后用STR_TO_DATE转换:
    假设你的CSV结构是name;数字;日期1;日期2;...(空列),对应的LOAD DATA语句如下:
LOAD DATA INFILE '/path/to/your/file.csv'
INTO TABLE table1
FIELDS TERMINATED BY ';'  -- 匹配CSV的分号分隔符
LINES TERMINATED BY '\n' -- 根据你的文件行分隔符调整,可能是'\r\n'
-- 用@变量接收原始字段,空列用@dummy占位
(name, num_col, @raw_date1, @raw_date2, @dummy1, @dummy2, @dummy3, @dummy4, @dummy5, @dummy6, @dummy7, @dummy8, @dummy9, @dummy10, @dummy11, @dummy12)
SET
  -- 清理日期字符串末尾的st/nd/rd/th后缀,再转换为DATE类型
  my_date = STR_TO_DATE(TRIM(TRAILING 'stndrdth' FROM @raw_date1), '%d %b %Y'),
  other_date = STR_TO_DATE(TRIM(TRAILING 'stndrdth' FROM @raw_date2), '%d %b %Y');
  • TRIM(TRAILING 'stndrdth' FROM @raw_date1):自动去掉字符串末尾的st/nd/rd/th,比如1st转为1,2nd转为2
  • %d %b %Y:对应日 月份缩写 年份的格式,比如1 Jan 2021可以被正确解析为DATE类型

二、将DATE字段格式化为12th Jun 2021样式

MySQL没有内置函数直接生成序数词后缀,需要通过CASE逻辑自定义:

SELECT
  CONCAT(
    DAY(my_date),
    -- 根据日期的日部分判断后缀
    CASE
      WHEN DAY(my_date) IN (11, 12, 13) THEN 'th'  -- 11/12/13特殊处理,用th
      WHEN RIGHT(DAY(my_date), 1) = '1' THEN 'st'
      WHEN RIGHT(DAY(my_date), 1) = '2' THEN 'nd'
      WHEN RIGHT(DAY(my_date), 1) = '3' THEN 'rd'
      ELSE 'th'
    END,
    ' ',
    DATE_FORMAT(my_date, '%b %Y')  -- 拼接月份缩写和年份
  ) AS formatted_date
FROM table1;

三、你之前尝试的代码为什么无效?

你用的DATE_FORMAT(my_date, 'DD MMM yyyy')是将已有的DATE类型转为字符串格式,但此时my_date已经是导入失败的0000-00-00,自然无法得到正确结果。正确的做法是在导入阶段就用STR_TO_DATE处理原始的日期字符串,而不是导入后再格式化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:01:17