MariaDB sec_to_time仅显示至23:59:59,结果异常求助
问题分析与解决
这不是你的操作失误,而是MariaDB 10.2.14版本中SEC_TO_TIME()函数的一个已知行为限制哦。
为什么会出现这个问题?
SEC_TO_TIME()函数的设计初衷是将秒数转换为数据库的TIME类型值,而非用来表示跨天的时长。在你使用的这个旧版本中,该函数会自动将输入的秒数对86400(一天的总秒数)取模,只保留一天内的剩余时间:
timestampdiff(SECOND, '2018-05-31T00:00:00', '2018-06-01T00:00:01')计算得到86401秒86401 % 86400 = 1,所以最终转换后就变成了00:00:01
如何得到预期的24:00:01?
如果需要显示跨天的时长,不要依赖SEC_TO_TIME(),而是手动计算并拼接小时、分钟、秒:
SELECT CONCAT( FLOOR(TIMESTAMPDIFF(SECOND, '2018-05-31T00:00:00', '2018-06-01T00:00:01') / 3600), ':', LPAD(FLOOR((TIMESTAMPDIFF(SECOND, '2018-05-31T00:00:00', '2018-06-01T00:00:01') % 3600) / 60), 2, '0'), ':', LPAD(TIMESTAMPDIFF(SECOND, '2018-05-31T00:00:00', '2018-06-01T00:00:01') % 60, 2, '0') ) AS duration UNION ALL SELECT CONCAT( FLOOR((24*60*60 + 1) / 3600), ':', LPAD(FLOOR(((24*60*60 + 1) % 3600) / 60), 2, '0'), ':', LPAD((24*60*60 + 1) % 60, 2, '0') ) AS duration;
执行这段SQL后,就能得到你预期的24:00:01结果了。
另外补充一点:在MariaDB的后续版本(比如10.3及以上)中,SEC_TO_TIME()对超过86400秒的输入处理已经调整,能够正确返回24:00:01这类跨时时长,如果你有条件的话,升级版本也能解决这个问题。
内容的提问来源于stack exchange,提问作者Skeeve
相关产品推荐
相关产品推荐

