Usuário com melhor resposta
Conversão e arredondamento de valor money

Pergunta
-
Estou com um problema para ajustar o valor da minha tabela para o novo layout da empresa.
O layout novo é 999999999.9999
ou seja, tamanho 14 e com 4 casas decimais.
Se eu uso o "as money" por exempo, um item de valo 0,675677
vai ficar 0,67568 com 5 casas decimais.
Se eu usar um "as money" junto com um "as char (14)" de 0,675677
ele arredonda para 0,7.
Existe alguma maneira de eu converter ou arredondando, mas mantendo o tamanho máximo de 14
e com 4 casas decimais, igual o layout da empresa?
Obrigado, se alguém puder ajudar, agradeço muito.
Respostas
-
xDougz,
Acredito que o melhor seria utilizar o Numeric, ao invês de money.
Seria um Numeric(14,4)!!!!
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]- Marcado como Resposta xDougz quinta-feira, 10 de fevereiro de 2011 13:37
-
Completando a resposta do Junior...
Como vc deseja 14 de escala e 4 de precisão, deverás declarar o datatype do atributo como numeric mesmo, porém deverá declará-lo da seguinte maneira:
NUM2 NUMERIC(18,4)
Com isso, o campo deverá permitir a inclusão de 18 numeros, sendo 4 deles casas decimais à direita da vírgula.
Abs,
Marco Rocha.
Marco Rocha- Marcado como Resposta xDougz quinta-feira, 10 de fevereiro de 2011 13:37
-
xDougz,
Bom dia! Eu não utilizaria o DECIMAL não... E o motivo é simples, é por conta do DECIMAL(18,4) utilizar 1 byte a mais do que o MONEY e armazenar menos valores no intervalo (1 dígito a menos...). Pode parecer que isso não tem influência, mas, imagine uma tabela de 30.000.000 de registros... Esse único byte em um único campo seria responsável por quase 30Mb a mais no espaço de armazenamento da sua base de dados...
O que eu faria é utilizar a função ROUND que faz exatamente o que você precisa. Veja o exemplo abaixo:
DECLARE
@valor MONEY, @decValor DECIMAL(18,4), @ValorTrunc MONEY, @decValorTrunc DECIMAL(18,4)
SET
@valor = 0.675677
SET
@decValor = 0.675677
SET
@ValorTrunc = ROUND(0.675677, 4, 1)
SET
@decValorTrunc = ROUND(0.675677, 4, 1)
SELECT
@valor, @decvalor, @ValorTrunc, @decValorTrunc
-- Resultado
--------------------- --------------------------------------- --------------------- ---------------------------------------
0,6757 0.6757 0,6756 0.6756
Espero ter ajudado!
Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008- Marcado como Resposta xDougz quinta-feira, 10 de fevereiro de 2011 13:37
Todas as Respostas
-
xDougz,
Acredito que o melhor seria utilizar o Numeric, ao invês de money.
Seria um Numeric(14,4)!!!!
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]- Marcado como Resposta xDougz quinta-feira, 10 de fevereiro de 2011 13:37
-
Completando a resposta do Junior...
Como vc deseja 14 de escala e 4 de precisão, deverás declarar o datatype do atributo como numeric mesmo, porém deverá declará-lo da seguinte maneira:
NUM2 NUMERIC(18,4)
Com isso, o campo deverá permitir a inclusão de 18 numeros, sendo 4 deles casas decimais à direita da vírgula.
Abs,
Marco Rocha.
Marco Rocha- Marcado como Resposta xDougz quinta-feira, 10 de fevereiro de 2011 13:37
-
Certo, Obrigado pela ajuda Junior e Marcos isso ajudou resolveu meu problema com o layout.
Agora eu estou com outro problema, eu queria retirar o arredondamento da ultima casa. Como no exemplo eu precisaria q o valor 0,675677 ficasse 0,6756 e não 0,6757
Dá pra resolver isso?
-
xDougz,
Bom dia! Eu não utilizaria o DECIMAL não... E o motivo é simples, é por conta do DECIMAL(18,4) utilizar 1 byte a mais do que o MONEY e armazenar menos valores no intervalo (1 dígito a menos...). Pode parecer que isso não tem influência, mas, imagine uma tabela de 30.000.000 de registros... Esse único byte em um único campo seria responsável por quase 30Mb a mais no espaço de armazenamento da sua base de dados...
O que eu faria é utilizar a função ROUND que faz exatamente o que você precisa. Veja o exemplo abaixo:
DECLARE
@valor MONEY, @decValor DECIMAL(18,4), @ValorTrunc MONEY, @decValorTrunc DECIMAL(18,4)
SET
@valor = 0.675677
SET
@decValor = 0.675677
SET
@ValorTrunc = ROUND(0.675677, 4, 1)
SET
@decValorTrunc = ROUND(0.675677, 4, 1)
SELECT
@valor, @decvalor, @ValorTrunc, @decValorTrunc
-- Resultado
--------------------- --------------------------------------- --------------------- ---------------------------------------
0,6757 0.6757 0,6756 0.6756
Espero ter ajudado!
Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008- Marcado como Resposta xDougz quinta-feira, 10 de fevereiro de 2011 13:37
-
Obrigado a Vocês que me ajudaram, eu "adaptei" tudo que vcs me
explicaram, e consegui resolver meu problema.
eu utilizei o seguinte código para resolver
Cast(Cast(Round(Cast(Item.Valor as Numeric (18,6)),4,1)as Numeric (18,4)) as CHAR (14))
Que me trouxe o resultado
--------------
0.6756
que era exatamente o que eu precisava.