Как в SQL преобразовать денежный тип данных в десятичный?

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

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

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


person Community    schedule 12.03.2009    source источник


Ответы (3)


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

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

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

person splattne    schedule 12.03.2009
comment
Спасибо, теперь я прогрессирую, но я не могу использовать команду SET, потому что я использовал 2871047428.20 в качестве примера. Это курс обмена валюты, который варьируется в зависимости от фактического кода валюты (например, евро, доллар США и т. д.), и вам необходимо будет выбрать последние курсы валют из таблицы.... - person ; 12.03.2009
comment
SELECT @exchangeReate = ... FROM ExchangeRate ... - Кстати: не стесняйтесь голосовать и/или соглашаться, если это помогло найти решение. ;-) - person splattne; 12.03.2009
comment
Привет, я приближаюсь, но все еще не работает правильно: - DECLARE @exchangeRate AS money SELECT @exchangeRate = CAST(Rate AS decimal(34,4)) / 10000000 FROM... Это правильный синтаксис? Да, я проголосую позже, еще раз спасибо. - person ; 12.03.2009
comment
Спасибо за вашу помощь вчера. В конце концов это было решено с помощью следующего кодирования: SELECT TOP (20) curcode AS 'Currency', curdate AS 'System Date', rate, cast((rate/cast(10000000 как float)) as decimal(20,8) ) КАК «Оценить» ОТ/ОТКУДА и т. д. - person ; 13.03.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))
person gbn    schedule 13.03.2009

ответ 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

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

person alextansc    schedule 12.03.2009