2017-08-29 42 views
3

我有一个小数列表存储为VARCHAR(50),每个都有不同的精度和规模(我没有设计/不能改变它)。我需要修改一些数字以四舍五入到最接近的比例(0.5变为0.6,0.001变为0.002,0.01000变为0.02000等)。如何将存储为varchar的小数增加到最近的比例?

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

'0.00', '0.05', '> 0.05' 

但我需要将其转换为所有小数:

'0.00', '0.05', '0.06' 

我可以得到一个数字(5)的比例为这样:

SELECT LEN(CAST(REVERSE(PARSENAME('84.274190',1)) AS INT)) 

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

SELECT '0.' + REPLICATE('0', LEN(CAST(REVERSE(PARSENAME('84.274190',1)) AS INT))-1) + '1' 

我如何将这两个添加到一起?我可以投到DECIMAL,但精度,比例因数而异。

我开始'84 0.274190' ,我想84年的0.274200'

+0

和0.106会去什么? – scsimon

+0

这将增加0.107 – TomNash

+0

为什么你不得到最后一个元素并增加它? – Bharat

回答

4

有趣的问题....这个怎么样?

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

我知道,我认为最初的设计并没有考虑到这种下游用途。你的解决方案非常接近。虽然测试'0.1990'。 – TomNash

+0

是的,我刚刚注意到了。一秒 – scsimon

+0

立即检查@TomNash – scsimon

相关问题