У меня есть тип данных денег в SQL Server. Как переформатировать 0.00 в 0 в моем запросе?
Как мне преобразовать из денежного типа данных в SQL-сервере?
Ответы (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))
Поможет ли вам приведение его к int? Деньги должны иметь десятичные разряды...
DECLARE @test AS money
SET @test = 3
SELECT CAST(@test AS int), @test
Прежде всего, вы никогда не должны использовать тип данных 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 всегда имеет два знака после запятой. Используйте целочисленный тип данных, если вам не нужна дробная часть или преобразование в целое число.
Возможно, вы хотите использовать десятичный или числовой тип данных?
Вы можете попробовать так:
SELECT PARSENAME('$'+ Convert(varchar,Convert(money,@MoneyValue),1),2)
Я нашел это подход прямой и полезный.
ПРЕОБРАЗОВАТЬ(VARCHAR(10), ПРЕОБРАЗОВАТЬ(ДЕНЬГИ, имя поля)) КАК ЦЕНА
Мне это кажется проблемой форматирования.
Что касается денежного типа SQL Server 0 == 0.00
Если вы пытаетесь отобразить 0, скажем, в С#, а не 0,00, вы должны преобразовать его в строку и отформатировать по своему усмотрению. (или обрезать его).
Кажется, несмотря на внутренние ограничения типа данных money, если вы уже используете его (или унаследовали, как я), ответ на ваш вопрос: используйте DECIMAL.
вы можете либо использовать
SELECT PARSENAME('$'+ Convert(varchar,Convert(money,@MoneyValue),1),2)
or
SELECT CurrencyNoDecimals = '$'+ LEFT( CONVERT(varchar, @MoneyValue,1),
LEN (CONVERT(varchar, @MoneyValue,1)) - 2)
У меня тоже была эта проблема, и я некоторое время спотыкался об нее. Я хотел отобразить 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».
int or bigint
- person Amirhossein   schedule 20.06.2020