numeric(4,2)类型时长四舍五入到最近15分钟间隔的实现方案
针对numeric(4,2)存储时长的15分钟间隔四舍五入方案
问题本质
你此前的写法错误原因是直接将存储值按普通十进制数值计算,忽略了当前的存储规则:数值整数部分为小时数,小数后两位为分钟数,而非十进制的小时小数单位,比如2.12代表2小时12分钟,不是2.12小时。
实现逻辑
- 先将存储的
numeric(4,2)值转换为总分钟数,统一计算单位 - 对总分钟数做15间隔的四舍五入
- 将四舍五入后的总分钟数转换为你要求的季度展示格式(15分钟=0.25,30分钟=0.5,45分钟=0.75)
分步计算示例(以输入值2.12为例)
- 转总分钟:
2 * 60 + 12 = 132分钟 - 15间隔四舍五入:
ROUND(132 / 15, 0) * 15 = 135分钟 - 转季度格式:
FLOOR(135/60) + (135 % 60)/60 = 2 + 0.25 = 2.25,和预期结果一致
SQL 实现代码(适配SQL Server语法,和你此前使用的语法兼容)
-- 替换@duration为你的时长字段即可 DECLARE @duration NUMERIC(4,2) = 2.12 -- 转总分钟 DECLARE @total_min INT = FLOOR(@duration) * 60 + CAST(ROUND((@duration - FLOOR(@duration)) * 100, 0) AS INT) -- 四舍五入到15分钟间隔 DECLARE @rounded_min INT = ROUND(@total_min / 15.0, 0) * 15 -- 转换为要求的输出格式 SELECT CONVERT(NUMERIC(4,2), FLOOR(@rounded_min / 60.0) + (@rounded_min % 60) / 60.0) AS rounded_duration
测试用例验证
| 输入值 | 预期含义 | 四舍五入后输出 |
|---|---|---|
| 1.07 | 1小时7分 | 1.25 |
| 3.28 | 3小时28分 | 3.50 |
| 0.58 | 0小时58分 | 1.00 |
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

