Как мне преобразовать из денежного типа данных в SQL-сервере?

У меня есть тип данных денег в SQL Server. Как переформатировать 0.00 в 0 в моем запросе?


person Community    schedule 10.02.2009    source источник
comment
Предоставьте более подробную информацию, и вы можете получить некоторые ответы.   -  person Philip Morton    schedule 10.02.2009
comment
Просто приведите или преобразуйте в int or bigint   -  person Amirhossein    schedule 20.06.2020


Ответы (9)


Обычные денежные преобразования сохранят отдельные пенни:

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))
person Jonathan    schedule 10.02.2009
comment
Это будет работать, если вы хотите отбросить все значения копеек, а не ТОЛЬКО, когда оно равно 0,00. Смотрите мой ответ для этого. - person Dan Field; 20.03.2015

Поможет ли вам приведение его к int? Деньги должны иметь десятичные разряды...

DECLARE @test AS money
SET @test = 3
SELECT CAST(@test AS int), @test
person Tina Orooji    schedule 10.02.2009

Прежде всего, вы никогда не должны использовать тип данных 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

Теперь, чтобы ответить на ваш вопрос (он был немного расплывчатым), тип данных money всегда имеет два знака после запятой. Используйте целочисленный тип данных, если вам не нужна дробная часть или преобразование в целое число.

Возможно, вы хотите использовать десятичный или числовой тип данных?

person SQLMenace    schedule 10.02.2009
comment
Microsoft Dynamics использует тип данных money. Я видел это сегодня. - person Pierre-Alain Vigeant; 29.01.2010
comment
Насколько реально хотеть умножить 450,50 * 32,76 доллара, я сидел здесь некоторое время, думая о том, когда бы я действительно хотел умножить денежные значения вместе или разделить их. Я использовал ваш пример sql и изменил */, чтобы использовать +-, и даже завернул их в * и/и значения для каждого совпали. - person Salizar Marxx; 20.03.2015
comment
Подробные комментарии к этому ответу см. в разделе этот ответ - person Beytan Kurt; 25.11.2016

Вы можете попробовать так:

SELECT PARSENAME('$'+ Convert(varchar,Convert(money,@MoneyValue),1),2)
person gdfgdgfdfg    schedule 24.12.2013

Я нашел это подход прямой и полезный.

ПРЕОБРАЗОВАТЬ(VARCHAR(10), ПРЕОБРАЗОВАТЬ(ДЕНЬГИ, имя поля)) КАК ЦЕНА

person liang    schedule 12.11.2014

Мне это кажется проблемой форматирования.
Что касается денежного типа SQL Server 0 == 0.00

Если вы пытаетесь отобразить 0, скажем, в С#, а не 0,00, вы должны преобразовать его в строку и отформатировать по своему усмотрению. (или обрезать его).

person Bravax    schedule 10.02.2009

Кажется, несмотря на внутренние ограничения типа данных money, если вы уже используете его (или унаследовали, как я), ответ на ваш вопрос: используйте DECIMAL.

person Stuart Helwig    schedule 29.01.2010

вы можете либо использовать

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

or

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

У меня тоже была эта проблема, и я некоторое время спотыкался об нее. Я хотел отобразить 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».

person Dan Field    schedule 20.03.2015