Truncar casas decimais (não arredondadas) no SQL Server


194

Estou tentando determinar a melhor maneira de truncar ou soltar casas decimais extras no SQL sem arredondamento. Por exemplo:

declare @value decimal(18,2)

set @value = 123.456

Este será automaticamente rodada @valuepara ser 123.46, o que é bom na maioria dos casos. No entanto, para este projeto, não preciso disso. Existe uma maneira simples de truncar os decimais de que não preciso? Eu sei que posso usar a left()função e converter de volta para um decimal. Existem outras maneiras?

Respostas:


188
select round(123.456, 2, 1)

27
A resposta deve explicar o que os parâmetros da função são
Tyler

9
SQL ROUND (número, casas decimais, operação): operação -> Se 0, arredonda o resultado para o número de casas decimais. Se outro valor que 0, truncará o resultado para o número de casas decimais. O padrão é 0
Midhun Darvin

você é um salva-vidas, eu tinha um valor para mostrar apenas os dois últimos dígitos "1.9991666", no entanto, sempre arredondava para 2, não importa o que eu usasse, com isso eu sou capaz de obter algo assim - selecione FORMAT (rodada (1.9991666 , 2, 1), 'N2') AS 'Rate', Obrigado companheiro
Spider

269
ROUND ( 123.456 , 2 , 1 )

Quando o terceiro parâmetro ! = 0 , trunca em vez de arredondar

http://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx

Sintaxe

ROUND ( numeric_expression , length [ ,function ] )

Argumentos

  • numeric_expression É uma expressão da categoria de tipo de dados numérico exato ou aproximado, exceto para o tipo de dados de bit.

  • length É a precisão na qual a expressão numérica deve ser arredondada. length deve ser uma expressão do tipo tinyint, smallint ou int. Quando comprimento é um número positivo, a expressão numérica é arredondada para o número de casas decimais especificadas pelo comprimento. Quando o comprimento é um número negativo, a expressão numérica é arredondada no lado esquerdo do ponto decimal, conforme especificado pelo comprimento.

  • function É o tipo de operação a ser executada. A função deve ser tinyint, smallint ou int. Quando a função é omitida ou tem um valor 0 (padrão), a expressão numérica é arredondada. Quando um valor diferente de 0 é especificado, a expressão numérica é truncada.

Alguém sabe quais valores para o argumento da função correspondem a tinyint, smallint e int? A Microsoft deixou essa parte da documentação e não encontra a resposta em lugar algum. msdn.microsoft.com/pt-BR/library/ms175003(SQL.90).aspx
Dave

O MS SQL SERVER arredonda números de maneira um pouco diferente do IQ. Para uso correcção da ronda (x, y, z) função como esta rodada (val1 / val2,4,1)
Warren LaFrance

37
SELECT Cast(Round(123.456,2,1) as decimal(18,2))

13

Aqui está a maneira que eu consegui truncar e não arredondar:

select 100.0019-(100.0019%.001)

retorna 100.0010

E seu exemplo:

select 123.456-(123.456%.001)

retorna 123.450

Agora, se você quiser se livrar do zero final, basta convertê-lo:

select cast((123.456-(123.456%.001)) as decimal (18,2))

retorna 123,45


10

Na verdade, qualquer que seja o terceiro parâmetro, 0 ou 1 ou 2, ele não arredondará seu valor.

CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))

Eu não entendo essa resposta. O SQL fornecido resulta em 10.01, que é um arredondamento correto de 10.0055 para duas casas decimais. Se o parâmetro final não for 0, o valor será truncado (com 2 casas decimais) para 10,00.
8128

7

Round tem um parâmetro opcional

Select round(123.456, 2, 1)  will = 123.45
Select round(123.456, 2, 0)  will = 123.46

3
Selecione a rodada (123.456, 2, 1) will = 123.450
Bikram

4
Não vejo por que isso é positivo. O acima irá fornecer 123.450 e 123.460, respectivamente.
Remykarem 28/02

7

Você quer o decimal ou não?

Caso contrário, use

select ceiling(@value),floor(@value)

Se você fizer isso com 0, faça uma rodada:

select round(@value,2)

1
Desculpe se não estava claro, preciso manter as casas decimais, basta largar as que não quero. Por exemplo, em vez de 123.456 no meu exemplo acima ser convertido para 123.46 ... Quero soltar o terceiro decimal e torná-lo 123.45.
Ryan Eastabrook 4/04/08

6

Outro truncado, sem solução de arredondamento 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

2
O +1 Floor()é o caminho para eliminar decimais sem arredondar de fato. Pena que Floor () não possui um segundo parâmetro para indicar em qual posição. Mas acho que o * 10) / 10 funciona muito bem com isso.
Der Decay

4

Isso removerá a parte decimal de qualquer número

SELECT ROUND(@val,0,1)

2
Isso não. SELECT ROUND (123.4560,0,1) fornece 123,0000.
Remykarem 28/02

2
SELECT CAST(Value as Decimal(10,2)) FROM TABLE_NAME;

Daria a você 2 valores após o ponto decimal. (SERVIDOR MS SQL)


1

Outra maneira é a ODBC TRUNCATEfunção:

DECLARE @value DECIMAL(18,3) =123.456;

SELECT @value AS val, {fn TRUNCATE(@value, 2)} AS result

LiveDemo

Resultado:

╔═════════╦═════════╗
   val    result  
╠═════════╬═════════╣
 123,456  123,450 
╚═════════╩═════════╝

Observação:

Eu recomendo usar a ROUNDfunção interna com o terceiro parâmetro definido como 1.


1
Função escalar ODBC - alternativa diferente!
Arulmouzhi 12/02

1

Sei que é tarde demais, mas não a vejo como resposta e tenho usado esse truque há anos.

Basta subtrair 0,005 do seu valor e usar Arredondar (@ num, 2).

Seu exemplo:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

retorna 123,45

Ele ajustará automaticamente o arredondamento para o valor correto que você está procurando.

A propósito, você está recriando o programa do filme Office Space?


0

Tente usar este código para converter 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


1) 3ª linha é completamente desnecessário 2) ele explicitamente disse que não deseja arredondar o número, mas truncar-lo (o resultado deve ser 123.45)
Damián Pablo González

0

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)

0

Eu sei que esta pergunta é realmente antiga, mas ninguém usou sub-strings para arredondar. Isso tem como vantagem a capacidade de arredondar números realmente longos (limite da sua string no SQL Server, que geralmente tem 8000 caracteres):

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)

0

Acho que podemos ir muito mais fácil com a solução de exemplo mais simples encontrada no Hackerrank:

Declaração do problema: consulte o maior valor das latitudes do norte (LAT_N) da STATION que seja menor que 137,2345. Trunque sua resposta para 4 casas decimais.

SELECT TRUNCATE(MAX(LAT_N),4)
FROM STATION
WHERE LAT_N < 137.23453;

A Solução acima dá uma ideia de como simplesmente tornar o valor limitado a 4 casas decimais. Se você deseja diminuir ou aumentar os números após o decimal, basta alterar 4 para o que quiser.


-3

Mod(x,1) é a maneira mais fácil que eu penso.


-5
select convert(int,@value)

1
Não era isso que o OP queria. Ele ainda quer casas decimais, mas deseja removê-las (truncadas) em vez de arredondá-las. IE 123.456 -> 123.45 NOT 123.456 -> 12.46 e NOT 123.456 -> 123
John
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.