【发布时间】:2023-03-20 01:40:01
【问题描述】:
我需要将浮点十进制数格式化为时间格式小时:分钟。
我用输入浮点和输出 varchar(6) 编写了这个标量值函数:
CREATE FUNCTIONE formatOre ( @input float )
returns varchar(6)
as
begin
declare @n float;
declare @hour int = floor(@input);
declare @minutes int = (select (@input - floor(@input)) * 60);
declare @val varchar(6)
set @val = right('00' + convert(varchar(2), @hour), 2) + ':' + right('00' + convert(varchar(2), @minutes), 2);
return @val
end
它看起来很棒,但不是所有记录。这是我的输出:
select formatOre (0) ---> 00:00
select formatOre (0.17) ---> 00:10
select formatOre (0.25) ---> 00:15
select formatOre (0.33) ---> 00:19
select formatOre (0.42) ---> 00:25
select formatOre (0.5) ---> 00:30
select formatOre (0.58) ---> 00:34
select formatOre (0.67) ---> 00:40
select formatOre (0.75) ---> 00:45
select formatOre (0.83) ---> 00:49
select formatOre (0.92) ---> 00:55
从结果可以看出,有3个错误转换:0.33 = 00:19 // 0.58 = 00:34 // 0.83 = 00:49.
如何设置正确的输出?
【问题讨论】:
-
“错误”是什么意思?您预期的正确输出是什么?对我来说,它看起来只是正确的
-
你为什么用浮点数或小数存储时间?
-
对于 input=.17 你得到
select (@input - floor(@input))*60=0.17*60=10.2并且由于它被声明为 int 你得到 10 作为结果。 -
我猜你在抱怨是因为你希望 0.33 是 00:20,0.58 是 00:35 和 0.83 = 00:50。如果您真的热衷于使用笨重的函数而不是简单的 FORMAT 命令来获取它,那么您可以使用 ROUND(
, 0) 包装分钟计算,即“声明@minutes int = ROUND((select (@input - floor(@input)) * 60), 0);”。这会给你想要的结果,但有更好的方法来做到这一点。 -
正如理查德所说,我希望 0.33 是 00:20 和其他。您写道,有“更好的方法”。那么,这些方法是什么?
标签: sql sql-server time type-conversion sql-convert