MySQL中如何通过enddatetime减去totaltime计算startdatetime?
解决MySQL中通过enddatetime和totaltime计算startdatetime的问题
看起来你在使用DATE_SUB时踩了个逻辑坑,导致计算结果完全偏离预期,咱们一步步把问题捋清楚并解决:
正确的计算方式
你的核心需求是用enddatetime减去totaltime得到startdatetime(以及你提到的datetimeofevent,假设它和startdatetime是同一个值),其实利用MySQL对TIME类型的原生支持就能轻松实现,不需要复杂的差值计算:
方法1:直接用HOUR_SECOND单位简化计算
因为totaltime是标准的HH:MM:SS格式TIME类型,MySQL的DATE_SUB函数支持HOUR_SECOND单位,它可以直接解析这种格式的时间值:
SELECT enddatetime, totaltime, DATE_SUB(enddatetime, INTERVAL totaltime HOUR_SECOND) AS startdatetime, DATE_SUB(enddatetime, INTERVAL totaltime HOUR_SECOND) AS datetimeofevent FROM your_table_name;
方法2:拆分时间分量分步计算
如果想更直观地控制小时、分钟、秒的扣除逻辑,也可以拆分totaltime的各个部分:
SELECT enddatetime, totaltime, DATE_SUB( DATE_SUB( DATE_SUB(enddatetime, INTERVAL HOUR(totaltime) HOUR), INTERVAL MINUTE(totaltime) MINUTE ), INTERVAL SECOND(totaltime) SECOND ) AS startdatetime, DATE_SUB( DATE_SUB( DATE_SUB(enddatetime, INTERVAL HOUR(totaltime) HOUR), INTERVAL MINUTE(totaltime) MINUTE ), INTERVAL SECOND(totaltime) SECOND ) AS datetimeofevent FROM your_table_name;
用你的示例数据测试:
enddatetime = '2018-05-14 15:00:00'totaltime = '14:00:00'
两种方法都会得到startdatetime = '2018-05-14 01:00:00',完全符合预期。
为什么你的原代码会出错?
咱们拆解一下你原来的代码逻辑:
DATE_SUB(enddatetime , INTERVAL (TimeDIFF(totaltime, Time(enddatetime ))) HOUR)
Time(enddatetime)提取出enddatetime的时间部分:15:00:00TIME_DIFF(totaltime, Time(enddatetime))计算的是14:00:00 - 15:00:00,结果是-01:00:00- 当你把这个时间差作为
HOUR单位的参数时,MySQL会强制将它转换成数字,最终只取了-1这个小时数 - 实际执行的逻辑变成了
DATE_SUB(enddatetime, INTERVAL -1 HOUR),相当于给enddatetime加了1小时,得到16:00:00,这自然和你想要的结果完全相反。
简单来说,你搞反了逻辑:不该去计算totaltime和enddatetime时间部分的差值,而是应该直接把totaltime作为要从enddatetime中扣除的时间间隔。
内容的提问来源于stack exchange,提问作者Zack
相关产品推荐
相关产品推荐

