MySQL STR_TO_DATE转换8/9点时间返回0:00的异常问题咨询
异常产生原因
该问题是旧版MySQL(5.6.5之前版本)STR_TO_DATE函数的解析逻辑缺陷,搭配格式符使用不当共同导致:
- 当前使用的
%H格式符,原生设计是匹配带前导零的两位数字24小时制小时,取值范围为00-23,本身并不适配无前置零的单数字小时场景。 - 5.6.5之前的MySQL在解析日期时间的数字分量时,错误使用八进制字符规则做合法性校验,仅将0-7判定为有效数字字符:
- 解析单数字的6点、7点时,字符6、7在合法校验范围内,函数可以正常识别小时值,返回正确结果
- 解析单数字的8点、9点时,字符8、9不在八进制合法字符范围内,函数会直接终止小时段的解析,将小时值默认置为0,最终返回时间部分为
0:00:00的错误结果 - 解析10点及以后的两位数字小时时,读取到的两个数字字符都在0-7范围内(比如10的1和0、11的1和1),可以正常完成两位匹配,返回正确结果。
解决方案
任选一种即可解决问题:
- 替换格式符:将格式串中匹配小时的
%H替换为%k,%k是专门用来匹配无前置零24小时制小时的格式符,取值范围0-23,适配单、双数字小时场景,修改后语句如下:
-- 8点、9点都可以正常转换 select STR_TO_DATE('2022-07-11 8:00:00', '%Y-%m-%d %k:%i:%s'); select STR_TO_DATE('2022-07-11 9:00:00', '%Y-%m-%d %k:%i:%s');
- 预处理时间字符串:提前把时间串里的单数字小时补前导零,统一成两位小时格式(比如把
8:00:00处理为08:00:00),再用原有%H格式符解析即可。 - 升级MySQL版本:直接升级到5.6.5及以上的正式GA版本,该类日期解析bug已经在新版本迭代中修复,不需要额外调整语句即可正常转换。
内容的提问来源于stack exchange,提问作者shiftman
相关产品推荐
相关产品推荐

