【问题标题】:In SQL how can I convert a money datatype to a decimal?在 SQL 中,如何将货币数据类型转换为小数?
【发布时间】:2009-03-12 11:53:31
【问题描述】:

我想将货币数据类型转换为小数,因为我想将结果记录到小数点后 8 位。

例如,在货币汇率表中,我看到存储为 2871047428.20 的汇率作为货币数据类型;使用 Microsoft SQL Management Studio,我想将其除以 10000000 以获得结果 287.10474282;但是我实际得到的结果是 287.1047。

我相信我只得到小数点后 4 位的原因是因为它是货币数据类型,因此我认为前进的方向是将其转换为十进制数据类型....

【问题讨论】:

    标签: sql types decimal currency


    【解决方案1】:

    这里比较左栏是十进制值,右栏是计算出来的钱值:

    DECLARE @money AS money
    SET @money = 2871047428.20
    SELECT CAST(@money AS decimal(34,4)) / 10000000, @money / 10000000
    

    另请参阅 Stack Overflow:

    【讨论】:

    • 谢谢 我现在正在进步,但我不能使用 SET 命令,因为我曾使用 2871047428.20 作为示例。这是一种根据实际货币代码(例如欧元、美元等)而变化的货币汇率,需要从表中获取最新的货币汇率......
    • SELECT @exchangeReate = ... FROM ExchangeRate ... - 顺便说一句:如果它有助于找到解决方案,请随意投票和/或接受。 ;-)
    • 嗨,我正在靠近,但它仍然无法正常工作:- DECLARE @exchangeRate AS money SELECT @exchangeRate = CAST(Rate AS decimal(34,4)) / 10000000 FROM...这个语法对吗?是的,我稍后会投票,再次感谢。
    • 感谢您昨天的所有帮助。最后,它通过以下编码解决:SELECT TOP (20) curcode AS 'Currency', curdate AS 'System Date', rate, cast((rate / cast(10000000 as float)) as decimal(20,8) ) 作为来自/WHERE 等的“比率”...
    【解决方案2】:

    你们都遇到了小数除法的怪事 这是我对another thread, T-SQL Decimal Division Accuracy的回答

    如果你使用 10000000.0,你也可能因为 data type precedence 而有隐式浮点转换

    DECLARE @money AS money
    SET @money = 2871047428.20
    --Oddities
    SELECT
        CAST(@money AS decimal(34,8)) / 10000000,
        CAST(@money AS decimal(34,8)) / 10000000.0,
        CAST(@money AS decimal(34,8)) / 10000000.00,
        CAST(@money AS decimal(34,8)) / 10000000.000,
        CAST(@money AS decimal(34,8)) / 10000000.0000
    --Should be safe. My brain hurts if I work through p and s
    SELECT
        CAST(@money AS decimal(38,8)) / CAST(10000000 AS decimal(8,0))
    

    【讨论】:

      【解决方案3】:
          SELECT CAST(currency_rate AS decimal) / 10000000 FROM ...
      

      【讨论】:

        【解决方案4】:

        splattne 的回答几乎是正确的,除了两个小改动:

        DECLARE @money AS money
        SET @money = 2871047428.20
        SELECT CAST(@money AS decimal(34,6)) / 10000000.0, @money / 10000000.0
        

        这将给出正确答案:287.10474282。我所做的是更改精度值并将“.0”添加到除法值。

        现在唯一让我感到困惑的是,我必须将值转换为小数 (34,6) 而不是预期的小数 (34,8)。

        所以,我用另一种方式编写了查询,这对我来说更有意义:

        DECLARE @money AS money
        SET @money = 2871047428.20
        SELECT CAST((@money / 10000000.0) AS decimal(34,8)), @money / 10000000.0
        

        请看看哪一种适合你。

        【讨论】:

          猜你喜欢
          • 2015-11-21
          • 2010-10-06
          • 2021-11-13
          • 2014-05-28
          • 1970-01-01
          • 1970-01-01
          • 2022-12-03
          • 2011-06-17
          • 1970-01-01
          相关资源
          最近更新 更多