将varchar便士转换为十进制磅和便士

时间:2014-10-15 15:54:00

标签: sql sql-server sql-server-2008 casting

我有一个字段varchar(100),它包含作为数字的便士,所有35个字符长,可能带有前导-ve。根据下面的第二和第三个字段,我需要以磅和便士的形式返回。

我得到了不同的结果

SELECT
   [Tax1_156_PaymentNotSubj]
  ,CAST(LEFT([Tax1_156_PaymentNotSubj],33) + '.' + RIGHT([Tax1_156_PaymentNotSubj],2) AS decimal(35,2)) AS NegCastDecs
  ,CONVERT(decimal(35,2), LEFT([Tax1_156_PaymentNotSubj],33) + '.' + RIGHT([Tax1_156_PaymentNotSubj],2)) AS NegConvDecs
  ,CAST((CAST([Tax1_156_PaymentNotSubj] AS integer)) / 10 AS decimal(35,2)) AS NegCastIntDecs

Results

我在最终的双重投射场中缺少什么,哪种方法最好?

1 个答案:

答案 0 :(得分:2)

转换为int将删除小数位。这本身不是问题,因为你没有在施法前划分数字。但是,如果涉及的两个数字都是整数类型,SQL Server将保持算术整数。这可以在一个简单的select语句中看到:

select 7/2

3的整数结果是最接近的基于整数的结果。在你的情况下,你的第三线双重演员需要两个更正:

,CAST((CAST([Tax1_156_PaymentNotSubj] AS integer)) / 100.0 AS decimal(35,2)) AS NegCastIntDecs

请注意,/ 10增加到100以获得正确的小数位置,而且数字常量也有小数。这种常量更改告诉SQL引擎将数字视为十进制值本身,并返回十进制结果。例如,在以下陈述中可以看到相同的内容:

select 7.0/2
select 7/2.0
select 7.0/2.0

所有这些都返回相同的3.5000 ...结果。如果算术运算中的两个数值都是整数,则会产生一个int。如果至少有一个是十进制,那么将产生一个小数。

编辑:作为旁注,这会使第二次演员变得多余。