SQL如何计算两个datetime值的精确小时差(含小数部分)
问题原因
DATEDIFF(HOUR, 开始时间, 结束时间)的计算逻辑是统计两个时间点之间跨过的整点小时边界数量,并非实际时间差换算的小时值:比如8:34到8:58没有跨过任何整点,返回值为0;10:33到次日8:37跨过了22个整点,返回值为22。你后续转换为decimal只是把整数结果转成了带两位小数的格式,自然不会出现小数部分。
解决方法
用更小的时间单位(秒/分钟)计算差值,再换算为小时即可,注意要除以浮点型数值避免整数除法自动取整:
SELECT DocID, CreateDate, CompletedDate, -- 用秒计算,精度最高,支持最大间隔为68年,完全满足普通业务场景 CONVERT(DECIMAL(10,2), DATEDIFF(SECOND, CreateDate, CompletedDate) / 3600.0) AS DiffHours FROM Documents
效果验证
按上述逻辑计算你的样例数据:
- 0001号单据间隔为23分46秒,换算后为≈0.40小时
- 0002号单据间隔为22小时4分11秒,换算后为≈22.07小时
如果你的业务不需要精确到秒,也可以改用分钟计算,将DATEDIFF(SECOND)替换为DATEDIFF(MINUTE),除数改为60.0即可。
内容的提问来源于stack exchange,提问作者EJF
相关产品推荐
相关产品推荐

