为什么不允许将decimal转换为time类型,如何实现对应时间值求和?
问题原因
- 数据库本身不支持直接将你自定义格式的
decimal类型转换为time类型:你存的decimal值是「小时.两位分钟」的自定义格式,不符合数据库decimal转time的内置规则,所以直接执行cast(arrival_time as time)会触发转换报错。 - 你当前编写的
datediff语句逻辑和需求不符:该语句是计算表中最早和最晚arrival_time的时间差,不是对所有arrival_time的值做累加求和。
实现方法
你需要先把每条decimal格式的时间拆分为小时、分钟两个整数,换算为总分钟数后求和,再转换成你需要的输出格式即可。
核心转换逻辑
- 提取小时:用
FLOOR(arrival_time)取decimal的整数部分,就是小时数 - 提取分钟:用
(arrival_time - FLOOR(arrival_time)) * 100取decimal的小数部分乘以100,加ROUND取整避免浮点精度误差,就是分钟数 - 单条记录总分钟数:
FLOOR(arrival_time) * 60 + ROUND((arrival_time - FLOOR(arrival_time)) * 100, 0) - 求和后总分钟数转成你原有的
decimal格式:FLOOR(总分钟数 / 60) + (总分钟数 % 60) / 100.0 - 求和后总分钟数转标准
time格式:不同数据库有对应内置函数,参考下方示例代码
示例代码
-- 先计算所有arrival_time的总分钟数 WITH total_min_cal AS ( SELECT SUM( FLOOR(arrival_time) * 60 + ROUND((arrival_time - FLOOR(arrival_time)) * 100, 0) ) AS total_min FROM 你的表名 ) -- 转换成不同格式输出 SELECT total_min AS 累计总分钟数, FLOOR(total_min / 60) + (total_min % 60)/100.0 AS 累计时间_decimal格式, -- MySQL转标准time格式写法 SEC_TO_TIME(total_min * 60) AS 累计时间_MySQL_time格式, -- SQL Server转标准time格式写法 DATEADD(minute, total_min, CAST('00:00:00' AS TIME)) AS 累计时间_SQLServer_time格式 FROM total_min_cal
拿你给出的示例值计算:6.23+6.58+5.51的总分钟数为383+418+351=1152分钟,转换后结果为19小时12分钟,对应decimal格式输出为19.12。
注意事项
建议后续存储这类时间值时,优先用整型存储总分钟数,或者分开存储小时、分钟字段,可以避免这类自定义格式带来的转换问题。
内容的提问来源于stack exchange,提问作者Louis Chopard
相关产品推荐
相关产品推荐

