У меня есть столбец DECIMAL(9,6)
, т.е. он поддерживает значения типа 999, 123456.
Но когда я вставляю данные типа 123,4567, они становятся 123,456700.
Как удалить эти нули?
В decimal(9,6)
хранится 6 цифр по правую сторону от запятой. Отображать или нет нули после запятой - это решение о форматировании, обычно принимаемое на стороне клиента.
Но поскольку SSMS форматирует float
без нулей в конце, вы можете удалить нули в конце, приведя decimal
к float
:
select
cast(123.4567 as DECIMAL(9,6))
, cast(cast(123.4567 as DECIMAL(9,6)) as float)
печатает:
123.456700 123,4567
(Мой десятичный разделитель - запятая, однако SSMS форматирует десятичную дробь точкой. Очевидно, это известная проблема).
Вы можете использовать формат (функция) `(SqlAzure и SQL сервер 2012+):
SELECT FORMAT(CAST(15.12 AS DECIMAL(9,6)), 'g18') -- '15.12'
SELECT FORMAT(CAST(0.0001575 AS DECIMAL(9,6)), 'g10') -- '0.000158'
SELECT FORMAT(CAST(2.0 AS DECIMAL(9,6)), 'g15') -- '2'
Будьте осторожны при использовании с плавающей точкой (или реальный): Дон'т использовать g17 или больше (или
Б8` или больше реального), - за ограниченной точности машинного представления вызывает нежелательные эффекты:
SELECT FORMAT(CAST(15.12 AS FLOAT), 'g17') -- '15.119999999999999'
SELECT FORMAT(CAST(0.9 AS REAL), 'g8') -- '0.89999998'
SELECT FORMAT(CAST(0.9 AS REAL), 'g7') -- '0.9'
Кроме того, обратите внимание, что в соответствии с документация:
формат опирается на присутствии .Чистая основу общий язык среды выполнения (CLR). Эта функция не будет работать удаленно, поскольку это зависит от наличие в среде CLR. Удаленный вызов функции, которая требует для среды CLR приведет к ошибке на удаленном сервере.
Работает в SqlAzure, тоже.
SELECT CONVERT(DOUBLE PRECISION, [ColumnName])
Я неохотно бросил в поплавок из-за возможности больше цифр в десятичной Мой, чем поплавок может представлять
Формат `` при использовании стандартного .чистая строка формата 'Г8' возвращается в научной нотации в случаях очень малых долях (например 1е-08), который также был непригоден
Используя строку пользовательского формата (https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings) позволило мне достичь того, чего я хотел:
DECLARE @n DECIMAL(9,6) =1.23;
SELECT @n
--> 1.230000
SELECT FORMAT(@n, '0.######')
--> 1.23
Если вы хотите, чтобы ваш номер, чтобы иметь по крайней мере одним нулем, так что 2.0 не станет 2, использовать строку формата 0.0#####
Десятичная точка локализована, так культур, которые используют запятую в качестве десятичного разделителя встретите выхода запятая, где . это
Конечно, это discouragable практике, имея слой данных делать форматирование (но в моем случае нет другого слоя; пользователь буквально запуска хранимой процедуры и помещение результата в электронной почте :/ )
SELECT REVERSE(ROUND(REVERSE(2.5500),1))
печатает:
2.55
Cast(20.5500 as Decimal(6,2))
должны сделать это.
У меня была похожая проблема, нужно обрезать незначащие нули из номера, как xx0000,x00000,xxx000
Я использовал:
select LEFT(code,LEN(code)+1 - PATINDEX('%[1-Z]%',REVERSE(code))) from Tablename
Код имя поля с номером, которые должны быть обрезаны. Надеюсь, это поможет кто-то другой.
У меня была аналогичная проблема, но также необходимо удалить десятичной точки, где без десятичных присутствовал, здесь было мое решение, которое разделяет десятичные на его составляющие, а также основы количество знаков от запятой строки по длине доли компонентов (без использования чехла). Чтобы сделать вопросы еще более интересные, мой номер был сохранен как поплавок без десятичных знаков.
DECLARE @MyNum FLOAT
SET @MyNum = 700000
SELECT CAST(PARSENAME(CONVERT(NUMERIC(15,2),@MyNum/10000),2) AS VARCHAR(10))
+ SUBSTRING('.',1,LEN(REPLACE(RTRIM(REPLACE(CAST(PARSENAME(CONVERT(NUMERIC(15,2),@MyNum/10000),1) AS VARCHAR(2)),'0',' ')),' ','0')))
+ REPLACE(RTRIM(REPLACE(CAST(PARSENAME(CONVERT(NUMERIC(15,2),@MyNum/10000),1) AS VARCHAR(2)),'0',' ')),' ','0')
Результат-это больно, я знаю, но у меня есть, с большой помощью от выше ответы.
Лучший способ-это не преобразование в плавать или деньги перед конвертированием из-за вероятность потери точности. Итак, безопасные способы могут быть что-то вроде этого :
CREATE FUNCTION [dbo].[fn_ConvertToString]
(
@value sql_variant
)
RETURNS varchar(max)
AS
BEGIN
declare @x varchar(max)
set @x= reverse(replace(ltrim(reverse(replace(convert(varchar(max) , @value),'0',' '))),' ',0))
--remove "unneeded "dot" if any
set @x = Replace(RTRIM(Replace(@x,'.',' ')),' ' ,'.')
return @x
END
где @значение может быть любой десятичное(х,г)
Мне нужно, чтобы удалить незначащие нули на мой десятичных знаков, чтобы я мог выведите строку определенной длины с <и>ведущих</а> нули
(например, мне нужно вывод 14 символов, так что 142.023400 станет 000000142.0234),
Я использовал parsename
, обратная
и бросил
как int
, чтобы удалить незначащие нули:
SELECT
PARSENAME(2.5500,2)
+ '.'
+ REVERSE(CAST(REVERSE(PARSENAME(2.5500,1)) as int))
(Чтобы потом получить мою ведущих нулей я могу повторить нужное количество нулей зависит от длины выше и сцепить это выше)
Я надеюсь, что это помогает кто-то.
можно удалить ведущие и конечные нули в TSQL не
Преобразовать его в строку с помощью функции STR TSQL не, если не строкой, то
Снять оба ведущих & незначащие нули
Выберите заменить(функция rtrim(функция ltrim(заменить(AccNo,'0',' '))),' ','0') AccNo от @банковского счета
Другой вариант...
Я не'т знаю, насколько эффективно это, но это, кажется, работает и не проходит через поплавок:
select replace(rtrim(replace(
replace(rtrim(replace(cast(@value as varchar(40)), '0', ' ')), ' ', '0')
, '.', ' ')), ' ', '.')
Средняя линия отсекает конечные пробелы, два внешних удалить точку, если нет десятичных цифр
Самый простой способ-это бросить значение как float, а затем строковый тип данных.
CAST(CAST(123.456000 AS FLOAT) AS VARCHAR(100))
Как насчет этого? Предполагая, что данные, поступающие в ваши функции, как @thisData:
BEGIN
DECLARE @thisText VARCHAR(255)
SET @thisText = REPLACE(RTRIM(REPLACE(@thisData, '0', ' ')), ' ', '0')
IF SUBSTRING(@thisText, LEN(@thisText), 1) = '.'
RETURN STUFF(@thisText, LEN(@thisText), 1, '')
RETURN @thisText
END
попробуйте это.
select CAST(123.456700 as float),cast(cast(123.4567 as DECIMAL(9,6)) as float)
Я понимаю, что это старый пост, но хотелось бы предоставить SQL, который я придумал
DECLARE @value DECIMAL(23,3)
set @value = 1.2000
select @value original_val,
SUBSTRING( CAST( @value as VARCHAR(100)),
0,
PATINDEX('%.%',CAST(@value as VARCHAR(100)))
)
+ CASE WHEN ROUND(
REVERSE( SUBSTRING( CAST(@value as VARCHAR(100)),
PATINDEX('%.%',CAST(@value as VARCHAR(100)))+1,
LEN(CAST(@value as VARCHAR(100)))
)
)
,1) > 0 THEN
'.'
+ REVERSE(ROUND(REVERSE(SUBSTRING( CAST(@value as VARCHAR(100)),
PATINDEX('%.%',CAST(@value as VARCHAR(100)))+1,
LEN(CAST(@value as VARCHAR(100)))
)
),1))
ELSE '' END AS modified_val
case when left(replace(ltrim(rtrim(replace(str(XXX, 38, 10), '0', ' '))), ' ', '0'), 1) = '.'
then '0'
else ''
end +
replace(ltrim(rtrim(replace(str(XXX, 38, 10), '0', ' '))), ' ', '0') +
case when right(replace(ltrim(rtrim(replace(str(XXX, 38, 10), '0', ' '))), ' ', '0'), 1) = '.'
then '0'
else ''
end
Я знаю, что эта ветка очень старая, но для тех, кто не использует SQL Server 2012 или более поздней или не можете использовать функцию формат по какой-либо причине следующих работ.
Кроме того, многие решения не работают, если число меньше 1 (например, 0.01230000).
Обратите внимание, что не работает с отрицательными числами.
DECLARE @num decimal(28,14) = 10.012345000
SELECT PARSENAME(@num,2) + REPLACE(RTRIM(LTRIM(REPLACE(@num-PARSENAME(@num,2),'0',' '))),' ','0')
set @num = 0.0123450000
SELECT PARSENAME(@num,2) + REPLACE(RTRIM(LTRIM(REPLACE(@num-PARSENAME(@num,2),'0',' '))),' ','0')
Возвращает 10.012345 и 0.012345 соответственно.