SQL - 使用Money设置十进制值

时间:2012-09-07 02:26:05

标签: sql

我正在尝试使用包含货币值的现有列,并使用这些列在另一列中设置一个十进制值。例如,如果我将“8.65”作为我的货币值,我试图将与该记录相关联的十进制值/列设置为“8.6500000000”。就我而言,我需要10个小数点的精度。

这是我尝试的代码,它没有做任何事情(它没有给出错误,它只是没有更新任何记录):

SET abc_PaidDecimal = CAST(abc_PaidAmnt AS DECIMAL(16,10))
WHERE abc_PaidDecimal <> CAST(abc_PaidAmnt AS DECIMAL(16,10))

3 个答案:

答案 0 :(得分:1)

如果abc_PaidDecimal包含NULL,则可以获得此行为。 NULL不能与任何其他值进行比较,唯一有效的比较是使用IS NULL或IS NOT NULL。

因此,请尝试将or abc_PaidDecimal IS NULL添加到您的WHERE子句

答案 1 :(得分:0)

8.65和8.6500000000000是相同的数字。

1和00001也是相同的数字。因此,在where条款中,<>将始终提供false。这就是为什么你没有更新任何东西

如果要更新所有字段,请使用此转换删除Where子句

答案 2 :(得分:0)

您无需将金钱明确地转换为十进制,它将被隐式转换 并存储为十进制(16,10)

然而要在8.65和8.650000之间进行比较,将两边都投射到varchar(26) 何时你不希望他们被平等对待。

WHERE   CAST(abc_PaidDecimal AS VARCHAR(26)) <> CAST(abc_PaidAmnt AS VARCHAR(26))

一个例子

DECLARE @v1 MONEY = 23.25
        ,@v2 DECIMAL(18,6)= 23.250000

SELECT @v1 , @v2
IF  @v1 = @v2
SELECT 'same value before cast'
ELSE 
SELECT 'different value before cast'

SELECT CAST(@v1 AS VARCHAR(26)) , CAST(@v2 AS VARCHAR(26))
IF  CAST(@v1 AS VARCHAR(26)) = CAST(@v2 AS VARCHAR(26))
SELECT 'same value after cast'
ELSE 
SELECT 'different value after cast'