quarta-feira, 21 de março de 2012

Arredondamento com Intervalo

Trabalhando com SQL Server 2000, surgiu-me a necessidade de arredondar valores decimais utilizando intervalos múltiplos de um valor que é obtido em uma tabela.

Infelizmente, o máximo que obtive das funções do SQL Server foi um arredondamento para cima, dado um número de casas decimais. O comando abaixo foi utilizado:

   1:  SELECT ROUND(2.1234,1) AS ValorArredondado1
   2:  SELECT ROUND(2.1234,2) AS ValorArredondado2
   3:  SELECT ROUND(2.1234,3) AS ValorArredondado3
   4:  SELECT ROUND(2.1234,4) AS ValorArredondado4

Observe o resultado:

ValorArredondado1
---------------------------------------
2.1000

ValorArredondado2
---------------------------------------
2.1200

ValorArredondado3
---------------------------------------
2.1230

ValorArredondado4
---------------------------------------
2.1234

Mas esse não é o resultado esperado, era necessário que o valor arredondado fosse obrigatoriamente o próximo múltiplo de um número (intervalo) passado como parâmetro.

Como não encontrei nada parecido nas funções de sistema do SQL Server, implementei a função abaixo para resolver o problema.

   1:  CREATE FUNCTION fn_ArredondaIntervalo
   2:  (
   3:        @Valor                         DECIMAL(18,2)
   4:       ,@Intervalo                     DECIMAL(18,2)
   5:   )
   6:  RETURNS DECIMAL(18,2)
   7:  AS
   8:  BEGIN
   9:      RETURN CEILING(@Valor / @Intervalo) * @Intervalo
  12:  END
  13:  GO


Para executá-la, deve-se utilizar chamadas como as do exemplo abaixo:

   1:  SELECT dbo.fn_ArredIntervalo(2.1234,.1) AS V1
   2:  SELECT dbo.fn_ArredondaIntervalo(2.1234,.25) AS V2
   3:  SELECT dbo.fn_ArredondaIntervalo(2.1234,.5) AS V3
   4:  SELECT dbo.fn_ArredondaIntervalo(2.1234,1) AS V4

Veja o resultado da execução:

V1
---------------------------------------
2.20

V2
---------------------------------------
2.25

V3
---------------------------------------
2.50

V4
---------------------------------------
3.00

Dessa forma, obtive o resultado esperado. No resultado acima, o número 2,1234 foi arredondado para o próximo múltiplo de 0,1 (em V1), próximo múltiplo de 0,25 (em V2) e assim por diante.

Até a próxima!

2 comentários:

Chico Chagas disse...

Ótima dica, estava com este mesmo problema, precisa arredondar para cima, mesmo que o final fosse menor que 5.

valeu

Winiston disse...

shooooow

Postar um comentário