我有一个字段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
我在最终的双重投射场中缺少什么,哪种方法最好?
答案 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。如果至少有一个是十进制,那么将产生一个小数。
编辑:作为旁注,这会使第二次演员变得多余。