为何MySQL中该时间格式化查询返回24:20而非0:20?
这不是Bug,是MySQL TIME类型与格式化的特殊逻辑
首先明确说:这绝对不是Bug,是你没注意到MySQL对超出00:00-23:59范围的TIME值的处理规则~
为什么会返回24:20?
MySQL的TIME类型支持的范围是'-838:59:59'到'838:59:59',并不局限于一天内的时间。当你执行DATE_ADD(time('23:30'), INTERVAL 50 MINUTE)时,得到的结果是'24:20:00'——这是一个合法的TIME值,只是超出了常规的“一天内小时数”范围。
而TIME_FORMAT()函数的作用是直接格式化输入的TIME值,哪怕这个值的小时数大于23。虽然文档里说%k表示0-23的小时,但那是针对“处于一天内的正常时间”而言的;如果输入的TIME值本身小时数超过23,TIME_FORMAT会如实显示这个数值,不会自动帮你转换成0-23的循环值。
怎么得到预期的0:20?
如果你想要的是“溢出后进入下一天的时间”,需要先把这个超出范围的TIME值转换为一天内的时间,有两种常用方法:
方法一:用秒数取模
一天有86400秒,对TIME值的总秒数取模,就能得到当天的时间:SELECT TIME_FORMAT(MOD(DATE_ADD(time('23:30'), INTERVAL 50 MINUTE), 86400), "%k:%i");执行后会返回
0:20。方法二:结合日期转换
把时间和某个日期结合成TIMESTAMP,溢出后会自动进入下一天,再提取时间部分:SELECT TIME_FORMAT(DATE_ADD(CURDATE(), INTERVAL '23:30' HOUR_MINUTE + INTERVAL 50 MINUTE), "%k:%i");这样也能得到
0:20的结果。
总结
这是MySQL对TIME类型的设计逻辑——它支持跨天的时间值,而TIME_FORMAT只会忠实地格式化输入值,不会自动做日期循环转换。只要调整一下处理步骤,就能得到你想要的结果啦~
内容的提问来源于stack exchange,提问作者ridwan skaterocks
相关产品推荐
相关产品推荐

