MySQL中跨AM/PM的TIME类型字段时间差计算异常问题及解决验证
解决TIME类型跨天时间差计算异常的问题
这个问题我之前也碰到过,本质是TIME类型本身不带日期维度,TIMEDIFF()函数只会单纯计算两个时间点的数值差,不会自动识别跨天的场景——当end_time是次日凌晨00:00时,它会被当成和start_time同一天的时间,算出来的差值是-19:00:00,用HOUR()提取后就得到了不符合预期的19小时(部分数据库会返回负数值,但都不是你想要的5小时)。
你自己尝试的CASE方案其实非常靠谱,核心思路是给时间补一个固定的日期锚点,当end_time早于start_time时,把end_time放到次日,这样就能准确计算跨天的实际时长:
CASE WHEN finish_time < start_time THEN TIMEDIFF(TIMESTAMP('2021:01:02', finish_time), TIMESTAMP('2021:01:01', start_time)) ELSE TIMEDIFF(TIMESTAMP('2021:01:01', finish_time), TIMESTAMP('2021:01:01', start_time)) END AS diff
如果你的数据库支持ADDTIME()函数(比如MySQL),还可以用更简洁的写法,直接给跨天的end_time加上24小时,模拟次日的时间:
TIMEDIFF( IF(end_time < start_time, ADDTIME(end_time, '24:00:00'), end_time), start_time ) AS diff
两种方法都能得到你预期的5小时结果,具体可以根据你的数据库环境选择。
内容的提问来源于stack exchange,提问作者M a m a D
相关产品推荐
相关产品推荐

