如何用SQL计算两类时间差值?TIMESTAMPDIFF返回NULL求助
问题原因与解决方案
问题根源
TIMESTAMPDIFF函数要求两个参数必须是合法的日期/时间类型,但你通过substring提取的chkin和wt1本质是字符串(如'08:23'、'08:00'),函数无法将这些字符串识别为可计算的时间值,因此返回NULL。
修复方案
通过STR_TO_DATE函数将提取的字符串转换为TIME类型,让TIMESTAMPDIFF能正常计算分钟差,提供两种实现方式:
方案一:转换提取后的字符串
修改后的SQL语句:
SELECT SUBSTRING(dtime, -8, 5) AS chkin, SUBSTRING(work_time, 1, 5) AS wt1, TIMESTAMPDIFF( MINUTE, STR_TO_DATE(SUBSTRING(dtime, -8, 5), '%H:%i'), STR_TO_DATE(SUBSTRING(work_time, 1, 5), '%H:%i') ) AS min_diff FROM ta_db WHERE id = 13181;
STR_TO_DATE('08:23', '%H:%i')会把字符串格式的时间转换为数据库可识别的TIME类型,确保TIMESTAMPDIFF能正常计算差值。
方案二:直接提取原字段的时间部分(更简洁可靠)
对于dtime这种DATETIME类型字段,直接用TIME()函数提取时间部分,无需手动截取字符串:
SELECT TIME(dtime) AS chkin, STR_TO_DATE(SUBSTRING(work_time, 1, 5), '%H:%i') AS wt1, TIMESTAMPDIFF( MINUTE, TIME(dtime), STR_TO_DATE(SUBSTRING(work_time, 1, 5), '%H:%i') ) AS min_diff FROM ta_db WHERE id = 13181;
额外说明
如果签到时间晚于上班时间,计算结果会是负数(比如你的示例中08:23比08:00晚,min_diff会返回-23),如果需要取绝对值,可在TIMESTAMPDIFF外层包裹ABS()函数。
内容的提问来源于stack exchange,提问作者Wilf
相关产品推荐
相关产品推荐

