如何从整数值中拆分十进制值?

时间:2010-10-09 19:06:25

标签: sql sql-server tsql

假设我有4.9值。

我想拆分4和.9 ......我怎么能这样做?

我可以使用FLOOR()来隔离4。 .9怎么样?我该如何隔离它?

我正在使用t-sql sql server 2005/2008

10 个答案:

答案 0 :(得分:12)

4.9%1

你可以做模数除1。

答案 1 :(得分:3)

Declare @money money

Set @money = 418.75

Select  convert(int,@money - (@money % 1))  as 'LeftPortion'
       ,convert(int, (@money % 1) * 100)    as 'RightPortion'

答案 2 :(得分:2)

我能想到的最简单的就是

SELECT IntegerPart = cast(4.9 AS int), DecimalPart = 4.9 - cast(4.9 AS int)

答案 3 :(得分:1)

许多大型机数据导入过程(在金融行业中很常见)需要一个固定宽度的列输入文件,该文件定义浮点数,其中整数值为几列,十进制值为几列。即他们希望数字4.019表示为000401900,其中前4个字符对应于整数,最后5个对应于小数组件。

对于这个应用程序,你必须做相当多的字符串操作,但一个好的开始是获得一个查询,它给你两个包含4和'01900'的字段。

Parsename()加上str()可以解决问题:

select integer_part = ltrim(str(4.019,25,0)), decimal_part = parsename(str(4.019, 25, 5),1)

str()在左侧填充空格,因此需要对整数进行ltrim。你可能只是在这里转换为int。 Parsename只解析以句点分隔的字符串标记。

这是这种方法的问题。注意不要混淆decimal_part列的数据类型:

select integer_part = 1, decimal_part = 4
union all
select integer_part = ltrim(str(4.019,25,0)), decimal_part = parsename(str(4.019, 25, 5),1)

结果:

integer_part    decimal_part
1   4
4   1900

这里预定的'01900'变成1900.因此:

select integer_part = 1, decimal_part = cast(4 as varchar(32))
union all
select integer_part = ltrim(str(4.019,25,0)), decimal_part = parsename(str(4.019, 25, 5),1)

结果:

integer_part    decimal_part
1   4
4   01900

答案 4 :(得分:0)

Declare @dec decimal(8,2)

Set @dec = 23.98

Select Left(@dec, CharIndex('.',@dec)-1) as 'LeftPortion',
        RIGHT(@Dec, len(@dec) - CharIndex('.',@dec)) as 'RightPortion'

答案 5 :(得分:0)

看一下parsename函数。我认为下面的代码将产生预期的结果。 选择parsename(4.9,2)给出4 选择parsename(4.9,1)给出9 parsename的输出可以直接用作这样的数字 选择parsename(4.9,2)* 2给出vaule 8

答案 6 :(得分:0)

另一种方法是

  

选择4.9-CAST(4.9为int)

答案 7 :(得分:0)

使用PatIndex进行转换的方法如下

declare @val nvarchar(10) = '4.9'
select 
    LEFT(@val,PATINDEX(N'%[.]%', @val)-1) Int_Val,
    RIGHT( @val, len(@val) - PATINDEX(N'%[.]%', @val) + 1) Dec_Val

答案 8 :(得分:0)

我尝试了不同的方法,但这个方式看起来对我来说非常好。

- 数字

Select  
Left(COLUMN_NAME, Case When CharIndex('.',COLUMN_NAME) = 0 Then 0 Else 
CharIndex('.',COLUMN_NAME)-1 END) as 'LeftPortion',  
RIGHT(COLUMN_NAME, len(COLUMN_NAME) - CharIndex('.',COLUMN_NAME)) as 
'RightPortion'  
From TABLE_NAME  

- 查找最大长度

Select  
COLUMN_NAME,
  MAX(LEN(Left(COLUMN_NAME, Case When Ind = 0 Then 0 Else Ind-1 END))) as 
LenBeforedecimal,  
MAX(LEN(Right(COLUMN_NAME, LEN(COLUMN_NAME) - Ind))) as afterdecimal  
From  
(Select  
COLUMN_NAME,  
CHARINDEX('.', Cast(COLUMN_NAME as varchar(30))) as Ind  
From TABLE_NAME) a  
Group BY COLUMN_NAME

答案 9 :(得分:0)

使用以下查询: 使用PARSENAME函数分割定界数据

SELECT value , PARSENAME(value,2) AS int_part,PARSENAME(value,1) AS DECIMAL_ONLY FROM table name

示例:4.9