Tive uma semana conturbada e não deu para postar
nada, mas comecei a escrever algo e terminei há pouco.
Bom...
Hoje vou falar sobre duas funções de linha simples:
round
e trunc.
Só relembrando as primeiras aulas de banco de dados
da faculdade, funções de linha simples são as que operam com uma linha de
conjunto de dados por vez. Se uma instrução SQL seleciona 20 linhas
(registros), a função será executada 20 vezes, uma para cada linha.
As funções round
e trunc podem ser usadas em
campos do tipo numérico e data, mas minha abordagem será apenas sobre número.
A função ROUND
Essa função realiza uma operação de arredondamento
de um valor com base em uma precisão especificada.
A sintaxe da função ROUND pode ser observada na Figura
1.
Figura 1 - Sintaxe da função
ROUND. (Fonte: Oracle Corporation)
O grau de arredondamento ou precisão é opcional e
caso exista, deve ser um valor decimal, e para o caso desse valor ser “n”, onde n > 0, o dígito significante ao arredondamento é encontrado (n+1) do
lado direito do ponto decimal, ou seja:
SELECT ROUND (1.259, 2) valor FROM DUAL;
A precisão é igual a 2 nesse exemplo, portanto o
dígito de arredondamento nesse caso será o de posição 2 após (lado direito) o
ponto, nesse caso o valor “5”.
Para o caso do valor da precisão ser um número
negativo, o dígito significante ao arredondamento é “n” colocado do lado esquerdo do ponto:
SELECT ROUND (136.479, -1) valor FROM DUAL;
Nesse caso a precisão é -1, então o arredondamento
será feito no primeiro dígito após o ponto decimal, nesse caso o valor “6”.
Se o valor numérico do dígito significante for
maior ou igual a 5, um arredondamento para cima ocorrerá, caso contrário será
um arredondamento para baixo. Se não for informada a precisão de arredondamento
para a função round, o grau padrão de arredondamento é zero, significando que a
origem será arredondada para o número inteiro mais próximo (lado esquerdo do
ponto decimal).
Vou dar uns exemplos para facilitar o entendimento:
SELECT ROUND (1652.479, 2) AS valor FROM DUAL
UNION ALL
SELECT ROUND (1652.479, 1) AS valor FROM DUAL
UNION ALL
SELECT ROUND (1652.479) AS valor FROM DUAL
UNION ALL
SELECT ROUND (1652.479, -1) AS valor FROM DUAL
UNION ALL
SELECT ROUND (1652.479, -2) AS valor FROM DUAL;
O resultado para as consultas do exemplo pode ser
conferido na Figura 2.
Figura 2 - Resultado de consultas
utilizando o comando round. (Fonte:
autoria própria)
A função TRUNC
A função trunc
realiza uma operação de truncamento em um valor numérico com base em uma
precisão decimal especificada, que assim como a função round, é opcional. A diferença entre as funções round e trunc é que
a segunda função “quebra” o resultado na precisão decimal especificada e não
tenta arredondar para cima ou para baixo.
A sintaxe do comando trunc pode ser configurada na Figura
3.
Figura 3 - Sintaxe da função TRUNC.
(Fonte: Oracle Corporation)
Como os conceitos entre as funções round e trunc são bem parecidos, vou partir para exemplos do comando TRUNC
para facilitar o entendimento:
SELECT TRUNC (1652.479123, 3) AS valor FROM DUAL
UNION ALL
SELECT TRUNC (1652.479123, 2) AS valor FROM DUAL
UNION ALL
SELECT TRUNC (1652.479123, 1) AS valor FROM DUAL
UNION ALL
SELECT TRUNC (1652.479123) AS valor FROM DUAL
UNION ALL
SELECT TRUNC (1652.479123, -1) AS valor FROM DUAL
UNION ALL
SELECT TRUNC (1652.479123, -2) AS valor FROM DUAL
UNION ALL
SELECT TRUNC (1652.479123, -3) AS valor FROM DUAL;
Figura 4 - Resultado de
consultas utilizando o comando trunc.
(Fonte: autoria própria)
Esses comandos de linhas simples são bastante
eficientes e muito útil quando se precisa trabalhar com precisões.
Espero ter conseguido passar o entendimento sobre
as funções.
Grande abraço e até a próxima!
Referências:
WATSON, JOHN – Ramklass, Roopesh (2010) – OCA
Oracle Database 11g – Fundamentos I SQL – Manual do Exame 1z0-051. Editora: ALTABOOKS.
ORACLE CORPORATION – ROUND (number).
Disponível em: http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions135.htm.
Acessado em 24/03/2013.
Excelente artigo... com certeza me tirou muitas dúvidas, pois estava confuso principalmente na lógica do arredondamento da função ROUND... obrigado :)
ResponderExcluirOlá, SilverHawk2099.
ExcluirQue bom que você gostou do post!
É frequente fazermos confusão nas funções TRUNC e ROUND, principalmente quando trabalhamos com precisões negativas.
Valeu e até a próxima!
Bom dia Raphael,
ResponderExcluirMuito bom seus artigos, PARABÉNS!!
Eu sou analista de teste de software e quero trabalha banco de dados e futuramente me tornar um DBA.
Eu gostaria de saber se você consegue montar um material passo a passo sobre PL/SQL para aprendizado.
Desde já agradeço.
Olá, Maciel!
ExcluirFico feliz e agradecido que tenha gostado dos posts. Isso é gratificante!
Quanto a montar um material sobre PL/SQL, posso fazer sim. Você tem preferência com tema para começar?
Vale lembrar que existem muitos livros sobre o assunto, inclusive livros da Oracle Press (http://www.mhprofessional.com/product.php?isbn=0071493697). Se preferir existe ele em português também.
Valeu e até a próxima!!
Rafael,
ResponderExcluirTenho uma dúvida que me fez chegar até aqui.
Existe alguma maneira de parametrizar como o número deve reagir, ou seja como deve ser a precisão numérica dele no próprio banco?
Cenário :
Tenho ambiente de desenvolvimento e homologação
com o mesmo número de TRUNC e ROUND e nos mesmo valores, MAS
mesmo com os dados IGUAIS tem diferença de 0,01 centavo nos valores,
então que surgiu a dúvida se existe algum parâmetro já no banco que possa gerar essa diferença
Obrigado pelo seu Post foi muito útil
Abraços!!
Edinaldo Sá
Olá Edinaldo.
ExcluirPrimeiramente desculpa a demora no retorno ao seu comentário.
Não ficou muito clara a situação, mas se o problema está na "perda de centavos" durante o cálculo em um pagamento te digo que isso é frequente.
Trabalhei por um tempo em um sistema que realizava pagamento e calculava em certo momento o valor que um funcionário havia recebido e o valor devido para pagar. Baseado nesse confronto de informações o sistema geraria um valor a pagar para o funcionário ou um valor a receber pela empresa. Comumente havia um valor a pagar (ou receber) de R$ 0,01 e até R$ 0,02, pois existia uma série de cálculos efetuados, com multiplicações e divisões de valores monetários, o que gerava um número com a precisão maior que 2 dígitos.
Para resolver essa situação, os analistas utilizaram uma regra de desprezar valores inferiores a R$ 0,05 para mais ou para menos (pagamento ou recebimento).
Não sei se é bem essa a situação, mas qualquer coisa entra em contato novamente.
Obrigado pela visita!!
Todos os arrendondamentos devem ser feitos somente no final da conta. Assim sendo, se existe uma série de divisões e multiplicações, essas contas devem ser realizadas com todos os dígitos, mesmo que sejam muitos, e somente no final use a regra do arredondamento para 2 casas decimais. Isso evita a perda de precisão no cálculo.
ExcluirExcelente explicação!
ResponderExcluirMuito obrigado me ajudou bastante
ResponderExcluir