Truncar (não Redondo) casas decimais no servidor SQL

Estou a tentar determinar a melhor maneira de truncar ou largar casas decimais extra em SQL sem arredondamentos. Por exemplo:

declare @value decimal(18,2)

set @value = 123.456

Isto irá rodar automaticamente @valor para 123.46....o que na maioria dos casos é bom. No entanto, para este projecto não preciso disso. Há uma maneira simples de truncar as casas decimais que não preciso? Eu sei que posso usar a função esquerda() e converter de volta para uma casa decimal...há outras formas?

Author: OMG Ponies, 2008-09-04

16 answers

select round(123.456, 2, 1)
 169
Author: Jimmy, 2018-10-10 16:03:13
ROUND ( 123.456 , 2 , 1 )

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

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

Sintaxe

Redondo (numeric_ expressão , comprimento [ ,função ] )

Argumentos

  • numeric_ expressão É uma expressão dos dados numéricos exactos ou numéricos aproximados categoria do tipo, excepto para os dados de bits tipo.

  • comprimento É a precisão com que a expressão numeric_expressão deve ser arredondada. o comprimento deve ser uma expressão do tipo tinyint, smallint, ou int. Quando o comprimento é um número positivo, a expressão numeric_expressão é arredondada ao número de posições decimais especificadas por comprimento. Quando o comprimento é um número negativo, a expressão numeric_expressão é arredondada ao lado esquerdo do ponto decimal, conforme especificado pelo comprimento.

  • função É o tipo de operação a realizar. a função deve ser tinyint, smallint, ou int. Quando a função é omitida ou tem um valor de 0 (por omissão), a expressão numeric_ expression é arredondada. Quando um valor diferente de 0 é especificado, a numeric_ expressão é truncada.
 229
Author: Jeff Cuscutis, 2015-07-02 09:17:30
SELECT Cast(Round(123.456,2,1) as decimal(18,2))
 27
Author: sth, 2009-11-13 07:04:58
Eis a forma como eu era capaz de truncar e não Redondo.
select 100.0019-(100.0019%.001)
O

Devolve 100. 0010

E o seu exemplo:

select 123.456-(123.456%.001)
O

Devolve 123, 450

Agora, se quiser livrar - se do zero final, basta lançá-lo:
select cast((123.456-(123.456%.001)) as decimal (18,2))
O

Devolve 123, 45

 12
Author: sth, 2009-11-13 07:02:37

Na verdade, seja qual for o terceiro parâmetro, 0 ou 1 ou 2, não irá arredondar o seu valor.

CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))
 9
Author: Jai, 2016-04-05 06:40:04

O Round tem um parâmetro opcional

Select round(123.456, 2, 1)  will = 123.45
Select round(123.456, 2, 0)  will = 123.46
 8
Author: Quentin, 2009-11-13 07:03:48

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
 5
Author: James, 2009-02-12 23:08:54
Queres a casa decimal ou não?

Se não, utilizar

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

Se o fizeres com 0 então faz uma Ronda:

select round(@value,2)
 5
Author: SQLMenace, 2012-06-14 20:53:37

Isto irá remover a parte decimal de qualquer número

SELECT ROUND(@val,0,1)
 4
Author: Probal, 2010-06-07 11:25:29
Sei que é muito tarde, mas não vejo isso como uma resposta e tenho usado este truque há anos.

Subtraia simplesmente .005 do seu valor e use Round (@num, 2).

O seu exemplo:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)
O

Devolve 123, 45

Irá ajustar automaticamente o arredondamento ao valor correcto que procura.

A propósito, estás a recriar o programa do cinema Office Space?
 1
Author: KeithL, 2017-01-26 19:24:59

Por favor 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

 0
Author: sth, 2009-11-13 07:03:35
Acho que só queres o valor decimal., neste caso, pode utilizar o seguinte:
declare @val decimal (8, 3)
SET @val = 123.456

SELECT @val - ROUND(@val,0,1)
 0
Author: Mohamed, 2010-06-07 11:24:35

Outra maneira é ODBC TRUNCATE Funçã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:

Recomendo a utilização da função built-in ROUND com o terceiro parâmetro definido como 1.

 0
Author: Lukasz Szozda, 2016-04-13 18:44:12
Sei que esta pergunta é muito antiga, mas ninguém usou sub-cordas para contornar. Isto como vantagem a capacidade de arredondar números realmente longos (limite do seu texto no servidor SQL que é normalmente 8000 caracteres):
SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)
 0
Author: tukan, 2018-03-27 07:52:26
select convert(int,@value)
 -3
Author: SQLMenace, 2008-09-04 15:52:24

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

 -3
Author: sth, 2009-11-13 07:01:32