В SQL, как я могу преобразовать тип данных деньги в десятичное? - PullRequest
7 голосов
/ 12 марта 2009

Я хочу преобразовать тип данных money в десятичное число, потому что я хочу записать результаты в 8 десятичных разрядов.

Например, в таблице курсов валют я вижу курс, сохраненный как 2871047428.20, в виде типа денег; используя Microsoft SQL Management Studio, я хочу разделить это на 10000000 для достижения результата 287.10474282; однако результат, который я на самом деле получаю, составляет 287,1047.

Я считаю, что причина, по которой я получаю только 4 знака после запятой, в том, что это тип данных money, и поэтому я думаю, что путь вперед - преобразовать это в тип десятичного числа ....

Ответы [ 4 ]

7 голосов
/ 12 марта 2009

Здесь сравнение левый столбец десятичного значения, правый столбец - расчетное денежное значение:

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

См. Также здесь о переполнении стека:

0 голосов
/ 13 марта 2009

Вы все поражаете странностями десятичного деления Вот мой ответ на другой поток, Точность десятичного деления T-SQL

И вы также можете иметь неявные преобразования с плавающей запятой из-за приоритета типа данных , если вы используете 10000000.0

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))
0 голосов
/ 12 марта 2009

ответ Сплатне почти верен, за исключением двух незначительных изменений:

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

Пожалуйста, посмотрите, какой из них работает для вас.

0 голосов
/ 12 марта 2009
    SELECT CAST(currency_rate AS decimal) / 10000000 FROM ...
...