You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 04:45:11