如何在SQL Server中从float类型十进制数计算总工时(时分)
解决SQL Server中float类型工时列的求和转换问题
现有旧表包含一个float类型的工时列,示例值如下:
2 5.3 7.45 0.5 0.3 2.05
需要按照以下逻辑计算总和并输出为18.40格式(整数部分为小时,小数部分为分钟):
- 小数部分统一转为两位后,按“小数部分×100=分钟数”规则转换,求和得到总分钟数;
- 整数部分直接求和得到总整数小时;
- 总分钟数转换为小时+剩余分钟,与总整数小时相加后,格式化为
X.XX的形式。
实现SQL查询
假设表名为WorkHours,工时列名为Hours,可以用以下查询实现需求:
SELECT CONCAT( total_hours + (total_minutes / 60), '.', RIGHT('0' + CAST(total_minutes % 60 AS VARCHAR), 2) ) AS total_work_hours FROM ( SELECT SUM(FLOOR(ROUND(h.Hours, 2))) AS total_hours, SUM(CAST((ROUND(h.Hours, 2) - FLOOR(ROUND(h.Hours, 2))) * 100 AS INT)) AS total_minutes FROM WorkHours h ) AS calc
代码说明
ROUND(h.Hours, 2):将float类型的工时值统一转为两位小数,解决5.3存储为5.3而非5.30的格式问题,同时规避浮点精度误差;FLOOR(ROUND(...)):提取每个工时的整数小时部分,求和得到总整数小时数;(ROUND(...) - FLOOR(...)) * 100:将小数部分转换为对应分钟数(如0.3→30分钟、0.05→5分钟),通过CAST转为整数避免浮点计算偏差;- 外层查询将总分钟数拆分为可转换的小时数和剩余分钟数,拼接时用
RIGHT('0' + ..., 2)保证分钟数为两位格式(如5分钟转为05),最终得到18.40这样的目标格式。
内容的提问来源于stack exchange,提问作者Relax
相关产品推荐
相关产品推荐

