Truncar (não Redondo) casas decimais no servidor SQL
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?
16 answers
select round(123.456, 2, 1)
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.
SELECT Cast(Round(123.456,2,1) as decimal(18,2))
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
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))
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
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
Se não, utilizar
select ceiling(@value),floor(@value)
Se o fizeres com 0 então faz uma Ronda:
select round(@value,2)
Isto irá remover a parte decimal de qualquer número
SELECT ROUND(@val,0,1)
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?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
declare @val decimal (8, 3)
SET @val = 123.456
SELECT @val - ROUND(@val,0,1)
Outra maneira é ODBC TRUNCATE
Função:
DECLARE @value DECIMAL(18,3) =123.456;
SELECT @value AS val, {fn TRUNCATE(@value, 2)} AS result
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.
SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)
select convert(int,@value)
Mod(x,1)
é a maneira mais fácil que penso.