我需要将一个以小数格式给出小数的数字转换为小数,
即。 11.16是十进制的11.5。这是因为16是32的基数,11.16应该读作11 + 16/32 = 11.5
我得到11.16作为字符串,我需要在SQL Server 2005数据库中将其更改为11.5作为数字。
执行此操作的任何较短方式而不是拆分字符串,转换为数字,数学,转换为字符串,连接然后转换为数字?
答案 0 :(得分:1)
作为不需要字符串拆分的函数:
CREATE FUNCTION MyFunc
(
@value varchar(10)
)
RETURNS float
AS
BEGIN
declare @dValue float
declare @fraction float
Select @dvalue = convert(float, @value)
Select @fraction = @dvalue - Convert(int, @dvalue)
Select @dvalue = (@dvalue - @fraction) + ((@fraction * 100) / 32)
RETURN @dvalue
END
注意:这假定'8/32'表示为0.08,而不是0.8
您应该调整“varchar(10)”以匹配您实际需要的内容。
答案 1 :(得分:1)
通常,问题中描述的数据类型来自各种财务数据,此类数据通常具有两个特征:
批量转换转换部分数据的可能策略,可能是建立数据中找到的不同值列表,转换这些值,存储值和结果[相对较小]查找表。然后可以对这样的表进行索引并在类似于以下
的更新查询中使用UPDATE myOriginialTable
SET DecValue = F2D.DecVal
FROM myOriginalTable T
JOIN FactoredToDecimalTable F2D on T.FValue = F2D.FValue
是否使用了具有查找表的上述技巧,也可以通过在表中查找输入值的小数部分来完成从Factored到Decimal的转换
CREATE TABLE Factored32ToDec
( F32 DECIMAL decimal(12,2),
Dec10 DECIMAL (12,2)
)
INSERT INTO Factored32ToDec VALUES (0, 0)
INSERT INTO Factored32ToDec VALUES (0.01, 1.0/32)
INSERT INTO Factored32ToDec VALUES (0.02, 2.0/32)
INSERT INTO Factored32ToDec VALUES (0.03, 3.0/32)
INSERT INTO Factored32ToDec VALUES (0.04, 4.0/32)
-- etc. (24 rows omitted)
INSERT INTO Factored32ToDec VALUES (0.30, 30.0/32)
INSERT INTO Factored32ToDec VALUES (0.31, 31.0/32)
UPDATE myOriginialTable
SET DecValue = FLOOR(FValue) + F2D.Dec10
FROM myOriginalTable T
JOIN Factored32ToDec F2D ON F2D.F32 = (FValue - FLOOR(FValue))
基本上这个想法假设[显然缓存] Factored32ToDec表中的查找将比相应的除法运算更快。我不确定是这样的......这需要进行分析/测试 另一方面,我已经看到了第一个查找方法(针对所有不同的值),正在使用中。这可以是解决问题的一种非常有效的方法,但是您获得的里程数取决于行总数,不同值的数量(以及各种索引的存在/不存在以及其他考虑因素)例如更新单个列与两个单独的列等。)。
注意:FLOOR()的用户暗示手头的值是数字;在某些情况下,输入数据只是一个字符串(这是“有用的”......不要问我为什么......存储没有前导零的值,即“X.1”是X + 1/32而“X.10”是X + 10/32)。因此,根据具体情况,可能需要在小数点处拆分字符串而不是使用FLOOR。 BTW,当编码为字符串(“。1”与.01)时,与算术方法相比,小查找表方法可以节省大量测试。