Truncar (não eliminatória) casas decimais no SQL Server
-
09-06-2019 - |
Pergunta
Estou tentando determinar a melhor maneira para truncar ou largar extra casas decimais no SQL sem arredondamento.Por exemplo:
declare @value decimal(18,2)
set @value = 123.456
Esta será automaticamente rodada @value
para ser 123.46
, o que é bom na maioria dos casos.No entanto, para este projeto, eu não preciso disso.Existe uma maneira simples para truncar o decimais eu não preciso?Eu sei que eu posso usar o left()
função e converter para decimal.Existem outras formas?
Solução
select round(123.456, 2, 1)
Outras dicas
ROUND ( 123.456 , 2 , 1 )
Quando o terceiro parâmetro != 0 ele trunca, ao invés de incluir rodadas
http://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx
Sintaxe
ROUND ( numeric_expression , comprimento [função ] )
Argumentos
numeric_expression É uma expressão do numérico exato ou aproximado de dados numéricos tipo de categoria, exceto para o tipo de dados bit.
comprimento É a precisão para que numeric_expression a ser arredondado.o comprimento deve ser uma expressão do tipo tinyint, smallint ou int.Quando o comprimento é um número positivo, numeric_expression é arredondado para o número de posições decimais especificada pelo seu comprimento.Quando o comprimento é um número negativo, numeric_expression é arredondado no lado esquerdo do ponto decimal, conforme especificado pelo comprimento.
- função É o tipo de operação a realizar.função deve ser tinyint, smallint ou int.Quando a função é omitido ou tem um valor de 0 (predefinição), numeric_expression é arredondado.Quando um valor diferente de 0 for especificado, numeric_expression é truncado.
SELECT Cast(Round(123.456,2,1) as decimal(18,2))
Aqui está a maneira que eu era capaz de truncar e não redondas:
select 100.0019-(100.0019%.001)
retorna 100.0010
E o seu exemplo:
select 123.456-(123.456%.001)
retorna 123.450
Agora, se você quiser se livrar de final zero, simplesmente lançá-lo:
select cast((123.456-(123.456%.001)) as decimal (18,2))
retorna 123.45
Na verdade, qualquer que seja o terceiro parâmetro é 0 ou 1 ou 2, ele não volta do seu valor.
CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))
Rodada tem um parâmetro opcional
Select round(123.456, 2, 1) will = 123.45
Select round(123.456, 2, 0) will = 123.46
Outro truncar sem arredondamento solução e exemplo.
Convert 71.950005666 to a single decimal place number (71.9)
1) 71.950005666 * 10.0 = 719.50005666
2) Floor(719.50005666) = 719.0
3) 719.0 / 10.0 = 71.9
select Floor(71.950005666 * 10.0) / 10.0
Você quer o decimal ou não?
Se não, use
select ceiling(@value),floor(@value)
Se você fizer isso com 0, em seguida, fazer uma rodada:
select round(@value,2)
Isto irá remover a parte decimal de qualquer número de
SELECT ROUND(@val,0,1)
Eu sei que isto é muito tarde, mas eu não vejo isso como uma resposta e têm vindo a utilizar este truque há anos.
Simplesmente subtrair .005 do seu valor e uso Rodada(@nm,2).
O seu exemplo:
declare @num decimal(9,5) = 123.456
select round(@num-.005,2)
retorna 123.45
Ele irá automaticamente ajustar o arredondamento para o valor correto que você está procurando.
A propósito, você está recriando o programa a partir do filme de Espaço de Escritório?
Por favor, tente usar esse código para a conversão de 3 valores decimais após um ponto em 2 casas decimais:
declare @val decimal (8, 2)
select @val = 123.456
select @val = @val
select @val
A saída é 123.46
Eu acho que você quer apenas o valor decimal, neste caso, você pode usar o seguinte:
declare @val decimal (8, 3)
SET @val = 123.456
SELECT @val - ROUND(@val,0,1)
Outra forma é ODBC TRUNCATE
função:
DECLARE @value DECIMAL(18,3) =123.456;
SELECT @value AS val, {fn TRUNCATE(@value, 2)} AS result
Saída:
╔═════════╦═════════╗
║ val ║ result ║
╠═════════╬═════════╣
║ 123,456 ║ 123,450 ║
╚═════════╩═════════╝
Comentário:
Eu recomendo usar o built-in ROUND
função com parâmetro 3ª definido para 1.
Eu sei que essa pergunta é bem velha, mas ninguém usou sub-cadeias a rodada.Isso como vantagem a capacidade de ronda muito longo números (limite de sua cadeia de caracteres no SQL server que é geralmente 8000 caracteres):
SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)
select convert(int,@value)
Mod(x,1)
é a maneira mais fácil que eu acho.