Как преобразовать тип данных money в SQL-сервере? - PullRequest
19 голосов
/ 10 февраля 2009

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

Ответы [ 9 ]

30 голосов
/ 10 февраля 2009

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

SELECT convert(varchar(30), moneyfield, 1)

Последний параметр определяет, как будет выглядеть выходной формат:

0 (по умолчанию) Никаких запятых каждые три цифры слева от десятичной точки и две цифры справа от десятичной точки; например, 4235,98.

1 Запятые через каждые три цифры слева от десятичной точки и две цифры справа от десятичной точки; например, 3510,92.

2 Без запятых каждые три цифры слева от десятичной точки и четыре цифры справа от десятичной точки; например, 4235,9819.

Если вы хотите обрезать пенни и считать в фунтах, вы можете использовать округление до ближайшего фунта, от пола до минимума целого фунта или потолок для округления фунтов:

SELECT convert(int, round(moneyfield, 0))
SELECT convert(int, floor(moneyfield))
SELECT convert(int, ceiling(moneyfield))
3 голосов
/ 10 февраля 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 всегда имеет два знака после запятой. Используйте целочисленный тип данных, если вы не хотите дробную часть, или конвертируйте в int.

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

3 голосов
/ 10 февраля 2009

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

DECLARE @test AS money
SET @test = 3
SELECT CAST(@test AS int), @test
1 голос
/ 12 ноября 2014

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

CONVERT (VARCHAR (10), CONVERT (ДЕНЬГИ, имя поля)) КАК ЦЕНА

0 голосов
/ 20 марта 2015

У меня тоже была эта проблема, и я на какое-то время споткнулся о нее. Я хотел отобразить 0,00 как 0 и в противном случае сохранить десятичную точку. Следующее не сработало:

CASE WHEN Amount= 0 THEN CONVERT(VARCHAR(30), Amount, 1) ELSE Amount END

Потому что результирующий столбец был вынужден быть столбцом ДЕНЬГИ. Чтобы решить эту проблему, работало следующее

CASE WHEN Amount= 0 THEN CONVERT(VARCHAR(30), '0', 1) ELSE CONVERT (VARCHAR(30), Amount, 1) END

Это имело значение, потому что моим последним столбцом назначения был VARCHAR (30), и потребители этого столбца выдали бы ошибку, если сумма была «0,00» вместо «0».

0 голосов
/ 24 декабря 2013

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

SELECT PARSENAME('$'+ Convert(varchar,Convert(money,@MoneyValue),1),2)
0 голосов
/ 20 марта 2012

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

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

или

SELECT CurrencyNoDecimals = '$'+ LEFT( CONVERT(varchar, @MoneyValue,1),    
       LEN (CONVERT(varchar, @MoneyValue,1)) - 2)
0 голосов
/ 29 января 2010

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

0 голосов
/ 10 февраля 2009

Для меня это похоже на проблему форматирования.
Что касается типа денег в SQL Server, то 0 == 0,00

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

...