如何将float类型Duration转换为可求和的分秒格式时间
报错原因
你遇到的Operand type clash: time is incompatible with float报错,是因为[dbo].[mobile]表中的[Duration]字段实际存储类型为time,而非你预设的float类型,直接对time类型字段执行FLOOR、加减乘等数值运算就会触发类型冲突。
解决方案
场景1:保留Duration为time类型
如果不需要修改字段类型,直接基于现有time类型字段处理,即可得到预期的mm:ss格式结果,同时生成支持求和的数值字段:
SELECT -- 输出预期的mm:ss格式化字符串 FORMAT(DATEDIFF(SECOND, '00:00:00', [Duration])/60 * 100 + DATEDIFF(SECOND, '00:00:00', [Duration])%60, '00:00') AS Time_Duration, -- 生成总秒数字段,可直接用于求和运算 DATEDIFF(SECOND, '00:00:00', [Duration]) AS Duration_Seconds FROM [dbo].[mobile]
求和时直接对Duration_Seconds字段做SUM运算,需要展示时再把总秒数转成mm:ss格式即可。
场景2:需要将Duration改为float类型
如果确认要把Duration调整为float类型(单位为分钟,比如1分15秒存储为1.25),先修改字段类型,再用修正后的逻辑查询:
-- 修改Duration字段类型为float ALTER TABLE [dbo].[mobile] ALTER COLUMN [Duration] FLOAT; -- 格式化查询,修正了原SQL中多余的逗号问题,增加ROUND避免小数精度误差 SELECT FORMAT(FLOOR([Duration])*100 + ROUND(([Duration]-FLOOR([Duration]))*60, 0), '00:00') AS Time_Duration, -- 原始float字段可直接用于求和运算,单位为分钟 [Duration] AS Duration_Minutes FROM [dbo].[mobile]
注意事项
不要直接对格式化后的Time_Duration字符串做求和运算,字符串运算不仅性能低,还容易出现精度错误,所有统计运算都基于数值类型的时长字段执行,展示时再做格式转换即可。
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

