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

为什么不允许将decimal转换为time类型,如何实现对应时间值求和?

问题原因
  1. 数据库本身不支持直接将你自定义格式的decimal类型转换为time类型:你存的decimal值是「小时.两位分钟」的自定义格式,不符合数据库decimal转time的内置规则,所以直接执行cast(arrival_time as time)会触发转换报错。
  2. 你当前编写的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:24:03