Sql 如何将存储为varchar的十进制数增加到最接近的小数位数?

Sql 如何将存储为varchar的十进制数增加到最接近的小数位数?,sql,sql-server,Sql,Sql Server,我有一个小数列表,存储为VARCHAR(50),每个小数的精度和比例都不同(我在设计中没有发言权/无法更改它)。我需要修改一些要四舍五入到最接近刻度的数字(0.5到0.6,0.001到0.002,0.01000到0.02000,等等) 原因是我们需要将某些bucketing函数的边界转换为小数。目前它存储为: '0.00', '0.05', '> 0.05' 但我需要把它转换成所有的小数: '0.00', '0.05', '0.06' 我可以得到一个数字(5)的刻度,如下所示: 我可以

我有一个小数列表,存储为
VARCHAR(50)
,每个小数的精度和比例都不同(我在设计中没有发言权/无法更改它)。我需要修改一些要四舍五入到最接近刻度的数字(0.5到0.6,0.001到0.002,0.01000到0.02000,等等)

原因是我们需要将某些bucketing函数的边界转换为小数。目前它存储为:

'0.00', '0.05', '> 0.05'
但我需要把它转换成所有的小数:

'0.00', '0.05', '0.06'
我可以得到一个数字(5)的刻度,如下所示:

我可以得到要添加到值(0.00001)中的数字,如下所示:

我怎样才能把这两个加在一起呢?我可以转换为十进制,但每个数字的精度、刻度都不同


我从“84.274190”开始,我想问“84.274200”

一个有趣的问题。。。。这个怎么样

declare @table table (col varchar(16))
insert into @table
values
('0.5'),
('0.001'),
('100.01000'),
('0.1060'),
('84.274190')


select
    col
    ,cast(col as decimal(32,16)) + cast('0.' + replicate('0',len(substring(col,charindex('.',col),99)) - patindex('%[1-9]%',reverse(substring(col,charindex('.',col),99))) - 1) + '1' as decimal(32,16))
    ,left(cast(cast(col as decimal(32,16)) + cast('0.' + replicate('0',len(substring(col,charindex('.',col),99)) - patindex('%[1-9]%',reverse(substring(col,charindex('.',col),99))) - 1) + '1' as decimal(32,16)) as varchar(256)),len(cast(cast(col as decimal(32,16)) + cast('0.' + replicate('0',len(substring(col,charindex('.',col),99)) - patindex('%[1-9]%',reverse(substring(col,charindex('.',col),99))) - 1) + '1' as decimal(32,16)) as varchar(256))) - patindex('%[1-9]%',reverse(cast(cast(col as decimal(32,16)) + cast('0.' + replicate('0',len(substring(col,charindex('.',col),99)) - patindex('%[1-9]%',reverse(substring(col,charindex('.',col),99))) - 1) + '1' as decimal(32,16)) as varchar(256)))) + 1)

from
    @table

那么0.106会变成什么呢?那会增加0.107,为什么你不得到最后一个元素并增加它呢?作为DDL+DML的样本数据和期望的结果会增加你快速得到正确答案的机会。@Bharat,很多数字都有尾随零,如果最后一个非零数字是9,然后我们还必须增加它之前的值。如果是“0.9999”呢?可以继续。我知道,我认为最初的设计没有考虑到这种下游用途。你的解决方案非常接近。用“0.1990”测试。是的,我刚注意到。一秒钟,现在检查一下@Tomnash这太好了。我把第二列用
左(…,LEN(col))
包装起来,看起来很完美。你能解释一下你是如何得出
十进制(32,16)
子字符串(…,99)
SELECT '0.' + REPLICATE('0', LEN(CAST(REVERSE(PARSENAME('84.274190',1)) AS INT))-1) + '1'
declare @table table (col varchar(16))
insert into @table
values
('0.5'),
('0.001'),
('100.01000'),
('0.1060'),
('84.274190')


select
    col
    ,cast(col as decimal(32,16)) + cast('0.' + replicate('0',len(substring(col,charindex('.',col),99)) - patindex('%[1-9]%',reverse(substring(col,charindex('.',col),99))) - 1) + '1' as decimal(32,16))
    ,left(cast(cast(col as decimal(32,16)) + cast('0.' + replicate('0',len(substring(col,charindex('.',col),99)) - patindex('%[1-9]%',reverse(substring(col,charindex('.',col),99))) - 1) + '1' as decimal(32,16)) as varchar(256)),len(cast(cast(col as decimal(32,16)) + cast('0.' + replicate('0',len(substring(col,charindex('.',col),99)) - patindex('%[1-9]%',reverse(substring(col,charindex('.',col),99))) - 1) + '1' as decimal(32,16)) as varchar(256))) - patindex('%[1-9]%',reverse(cast(cast(col as decimal(32,16)) + cast('0.' + replicate('0',len(substring(col,charindex('.',col),99)) - patindex('%[1-9]%',reverse(substring(col,charindex('.',col),99))) - 1) + '1' as decimal(32,16)) as varchar(256)))) + 1)

from
    @table