如何在SQL Server中将货币数据类型转换?

23
我在 SQL Server 中有一个货币数据类型。 如何在查询中将 0.00 重新格式化为 0?

提供更多细节,你可能会得到一些答案。 - Philip Morton
只需将其 转换或转化intbigint - Amirhossein
9个回答

33

正常的货币转换会保留每一分钱:

SELECT convert(varchar(30), moneyfield, 1)

最后一个参数决定了输出格式的样式:

0(默认):小数点左边每隔三位不带逗号,小数点右边保留两位;例如:4235.98。

1:小数点左边每隔三位带逗号,小数点右边保留两位;例如:3,510.92。

2:小数点左边每隔三位不带逗号,小数点右边保留四位;例如:4235.9819。

如果您想截断小数点后面的数字并计算英镑金额,则可以使用四舍五入到最接近的英镑,向下取整到最低整数英镑或向上取整到英镑:

SELECT convert(int, round(moneyfield, 0))
SELECT convert(int, floor(moneyfield))
SELECT convert(int, ceiling(moneyfield))

如果您想丢弃所有的一分钱价值,而不仅仅是当它为0.00时,这将起作用。请参阅我的答案。 - Dan Field

3
你认为将它转换为整数会有帮助吗?钱本来就应该有小数位...
DECLARE @test AS money
SET @test = 3
SELECT CAST(@test AS int), @test

3

首先,您永远不应该使用money数据类型。如果进行任何计算,您将得到截断的结果。运行以下内容以查看我的意思:

DECLARE
    @mon1 MONEY,
    @mon2 MONEY,
    @mon3 MONEY,
    @mon4 MONEY,
    @num1 DECIMAL(19,4),
    @num2 DECIMAL(19,4),
    @num3 DECIMAL(19,4),
    @num4 DECIMAL(19,4)

    SELECT
    @mon1 = 100, @mon2 = 339, @mon3 = 10000,
    @num1 = 100, @num2 = 339, @num3 = 10000

    SET @mon4 = @mon1/@mon2*@mon3
    SET @num4 = @num1/@num2*@num3

    SELECT @mon4 AS moneyresult,
    @num4 AS numericresult

输出: 2949.0000 2949.8525

现在回答你的问题(有点含糊不清),货币数据类型始终有小数点后两位。如果您不想要小数部分,请使用整数数据类型或将其转换为int。

也许您想使用十进制或数字数据类型?


1
Microsoft Dynamics使用货币数据类型。我今天看到了。 - Pierre-Alain Vigeant
2
想要计算 $450.50 * $32.76 真的有多少实际意义呢?我思考了一会儿,想不出任何时候我会需要将货币价值相乘或相除。我使用了你的 SQL 示例,并将 */ 改为了 +-,甚至在其中添加了 * 和 /,每个值都匹配了。 - Salizar Marxx
有关此答案的详细评论,请参见此答案 - Beytan Kurt

1

我也遇到了这个问题,并且在一段时间内被绊倒了。我想要将0.00显示为0,而其他情况下保留小数点。以下方法没有起作用:

CASE WHEN Amount= 0 THEN CONVERT(VARCHAR(30), Amount, 1) ELSE Amount END

由于生成的列被强制转换成了MONEY类型,为了解决这个问题,以下方法可行。
CASE WHEN Amount= 0 THEN CONVERT(VARCHAR(30), '0', 1) ELSE CONVERT (VARCHAR(30), Amount, 1) END

这很重要,因为我的最终目的地列是一个VARCHAR(30),如果一个金额是'0.00'而不是'0',那么该列的消费者将会出错。

1
我发现这个 方法 直接而有用。
CONVERT(VARCHAR(10), CONVERT(MONEY, fieldname)) AS PRICE

1

看起来,尽管货币数据类型存在固有限制,但如果您已经在使用它(或像我一样继承了它),那么回答您的问题的答案是使用DECIMAL。


1
你可以试试这样做:

SELECT PARSENAME('$'+ Convert(varchar,Convert(money,@MoneyValue),1),2)

0

你可以使用

SELECT PARSENAME('$'+ Convert(varchar,Convert(money,@MoneyValue),1),2)

或者

SELECT CurrencyNoDecimals = '$'+ LEFT( CONVERT(varchar, @MoneyValue,1),    
       LEN (CONVERT(varchar, @MoneyValue,1)) - 2)

0

这看起来像是一个格式问题。
就 SQL Server 的货币类型而言,0 == 0.00

如果你想在 C# 中显示 0 而不是 0.00,你应该将它转换为字符串,并按照你想要的格式进行格式化(或截断它)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接