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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 07:06:47