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

MySQL中日期类型转换问题:STR_TO_DATE函数调用无效求助

嘿,这个问题我之前帮同事解决过,核心问题是你没给STR_TO_DATE()指定精确的格式匹配规则,而且还要注意月份缩写的区域设置,以及时区部分的处理。下面给你具体的解决方案:

解决步骤

1. 先搞懂STR_TO_DATE()的匹配逻辑

MySQL的STR_TO_DATE()不会自动猜测输入字符串的格式,你必须明确告诉它每个片段对应的格式符。针对你的字符串'25-Mar-2018 12:52 PM MDT',各部分对应的格式符是:

  • 25 → %d(两位数字的日期)
  • Mar → %b(英文月份缩写)
  • 2018 → %Y(四位数字的年份)
  • 12:52 → %h:%i(12小时制的时:分)
  • PM → %p(AM/PM标识)
  • MDT → 这部分是时区缩写,MySQL没有专门的格式符匹配它,我们可以直接把它作为固定字符串处理,或者提前截取掉。

2. 方案一:固定时区场景下的直接匹配

如果你的输入字符串时区都是MDT,可以直接把MDT写进格式中,再用DATE()提取纯日期部分(毕竟你要转成MySQL的DATE类型):

-- 先设置数据库用英文区域解析月份缩写,否则可能识别不了Mar
SET lc_time_names = 'en_US';

SELECT DATE(STR_TO_DATE('25-Mar-2018 12:52 PM MDT', '%d-%b-%Y %h:%i %p MDT')) AS converted_date;

执行后会返回2018-03-25,这正是DATE类型的标准结果。

3. 方案二:兼容可变时区的通用写法

如果输入的时区可能变化(比如偶尔是MST),可以先用SUBSTRING_INDEX()截取掉最后一个空格后的时区部分,再解析核心的日期时间:

SET lc_time_names = 'en_US';

SELECT DATE(STR_TO_DATE(SUBSTRING_INDEX('25-Mar-2018 12:52 PM MDT', ' ', 4), '%d-%b-%Y %h:%i %p')) AS converted_date;

这里SUBSTRING_INDEX(..., ' ', 4)会提取前4个空格分隔的内容,也就是'25-Mar-2018 12:52 PM',完美避开了后面的时区字符串。

4. 必看注意点:月份缩写的区域设置

如果不执行SET lc_time_names = 'en_US';,数据库可能用默认的非英文区域(比如中文),导致无法识别Mar这种英文月份缩写,这一步绝对不能省!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:46:15