Dígitos significativos do SQL Server
-
27-10-2019 - |
Pergunta
Tenho uma variável que quero retornar no máximo 5 à esquerda da vírgula decimal e sempre 3 à direita
CONVERT(VARCHAR(14),CONVERT(DECIMAL(8,3),
DATEDIFF(MILLISECOND,@ProcessTime,GETDATE()))/@OneThousand)
Agora as variáveis são definidas como
DECLARE @ProcessTime DATETIME
DECLARE @OneThousand DECIMAL(8,3)
SET @OneThousand = 1000.000
Isso sempre retorna algo como
0.003000000000
Acho que posso resolver meu problema com uma função esquerda, mas minha pergunta é por que isso acontece.Se a variável mínima do decimal for definida, @OneThousand
, é 3, o valor de retorno não deveria ter 3 casas decimais?
Solução
O resultado da divisão de DECIMAL(8,3)
por DECIMAL(8,3)
fornece um tipo de dados de DECIMAL(20,12)
para ver isso
DECLARE @ProcessTime DATETIME =getdate()
DECLARE @OneThousand DECIMAL(8,3)
SET @OneThousand = 1000.000
DECLARE @v SQL_VARIANT
SET @v = CONVERT(DECIMAL(8,3),
DATEDIFF(MILLISECOND,@ProcessTime,GETDATE()))/@OneThousand
SELECT
CAST(SQL_VARIANT_PROPERTY(@v, 'BaseType') AS VARCHAR(30)) AS BaseType,
CAST(SQL_VARIANT_PROPERTY(@v, 'Precision') AS INT) AS Precision,
CAST(SQL_VARIANT_PROPERTY(@v, 'Scale') AS INT) AS Scale
A seção BOL que explica por que decimal(20,12)
é aqui
Operation: e1 / e2
Result precision: p1 - s1 + s2 + max(6, s1 + p2 + 1)
Result scale: max(6, s1 + p2 + 1)
Então no seu caso
Result precision: 8 - 3 + 3 + max(6, 3 + 8 + 1) = 20
Result scale: max(6, 3 + 8 + 1) = 12
Outras dicas
Tentar...
SELECT CAST(DATEDIFF(ms, @processDate, GETDATE()) / 1000.000 AS decimal(8,3))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow