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?

Foi útil?

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
scroll top