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
相关产品推荐
相关产品推荐

