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?

Ryan Eastabrook
fonte

Respostas:

188
select round(123.456, 2, 1)
Jimmy
fonte
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.
Jeff Cuscutis
fonte
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))
sth
fonte
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

sth
fonte
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))
Jai
fonte
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
Quentin
fonte
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)
SQLMenace
fonte
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
James
fonte
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)
Probal
fonte
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)

Dawood Zaidi
fonte
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.

Lukasz Szozda
fonte
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?

KeithL
fonte
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

sth
fonte
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)
Mohamed
fonte
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)
tukan
fonte
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.

Ishwor Bhusal
fonte
-3

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

sth
fonte
-5
select convert(int,@value)
SQLMenace
fonte
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