В SQL как я могу преобразовать денежный тип данных в десятичный?
Вопрос
Я хочу преобразовать денежный тип данных в десятичный, потому что я хочу записать результаты с точностью до 8 знаков после запятой.
Например, в таблице курсов валют я вижу курс, сохраненный как 2871047428,20 в качестве денежного типа данных;используя Microsoft SQL Management Studio, я хочу разделить это на 10000000, чтобы получить результат 287.10474282;однако результат, который я на самом деле получаю, равен 287.1047.
Я полагаю, что причина, по которой я получаю только 4 знака после запятой, заключается в том, что это тип данных money, и поэтому я думаю, что дальнейший путь - преобразовать это в десятичный тип данных....
Решение
Здесь для сравнения в левом столбце указано десятичное значение, в правом столбце - рассчитанное денежное значение:
DECLARE @money AS money
SET @money = 2871047428.20
SELECT CAST(@money AS decimal(34,4)) / 10000000, @money / 10000000
Смотрите также здесь о переполнении стека:
Другие советы
ответ Сплатне почти верный, за исключением двух незначительных изменений:
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
Пожалуйста, посмотрите, какой из них работает для вас.
Вы все поражаете странностями десятичного деления Вот мой ответ на другой поток, Точность десятичного деления 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))
SELECT CAST(currency_rate AS decimal) / 10000000 FROM ...