T-Sql remove ponto decimal do tipo de dados Money
-
08-06-2019 - |
Pergunta
Dada a restrição de usar apenas T-Sql no Sql Server 2005, existe uma maneira melhor de remover o ponto decimal de um tipo de dados monetário do que uma conversão para um varchar (aqui implicitamente) e, em seguida, uma substituição do ponto decimal?
Aqui está o que tenho atualmente.
SELECT REPLACE(1.23, '.', ''), REPLACE(19.99, '.', '')
Que retorna o desejado 123 e 1999, mas fiquei pensando se existe uma maneira melhor.Alguma ideia?
Solução
Multiplique por 100 e converta para um int.
Outras dicas
Você nunca deve usar o tipo de dados money para armazenar valores monetários.Se você fizer algum cálculo, obterá resultados truncados.Execute o seguinte para ver o que quero dizer
DECLARE
@mon1 MONEY,
@mon2 MONEY,
@mon3 MONEY,
@mon4 MONEY,
@num1 DECIMAL(19,4),
@num2 DECIMAL(19,4),
@num3 DECIMAL(19,4),
@num4 DECIMAL(19,4)
SELECT
@mon1 = 100, @mon2 = 339, @mon3 = 10000,
@num1 = 100, @num2 = 339, @num3 = 10000
SET @mon4 = @mon1/@mon2*@mon3
SET @num4 = @num1/@num2*@num3
SELECT @mon4 AS moneyresult,
@num4 AS numericresult
Saída:2949.0000 2949.8525
Você poderia ser um pouco mais específico sobre o caso de uso?Remover o ponto decimal da representação é um pouco incomum, pois você perderá todas as informações sobre a escala.Você está assumindo que sempre haverá dois dígitos?Nesse caso, você poderia simplificar, multiplicar por 100 e arredondar antes de converter para uma string.
Lembre-se de que o tipo de dados money pode ter até 4 dígitos após o decimal.Valores com mais de dois dígitos podem não funcionar conforme o esperado para sua solução original ou para o truque x100.
Aqui está a mágica:
DataFormatString="{0:c0}
Isso removerá as casas decimais.