Question

J'ai une variable que je veux revenir un maximum de 5 à gauche de la décimale et toujours 3 à droite

CONVERT(VARCHAR(14),CONVERT(DECIMAL(8,3),
        DATEDIFF(MILLISECOND,@ProcessTime,GETDATE()))/@OneThousand)

Les variables sont définies comme

DECLARE @ProcessTime DATETIME 
DECLARE @OneThousand DECIMAL(8,3)
SET @OneThousand = 1000.000

retourne toujours quelque chose comme

0.003000000000

Je suppose que je peux résoudre mon problème avec une fonction gauche, mais ma question est pourquoi cela se produit tout. Si la variable minimum de décimales défini, @OneThousand, est 3 ne devrait pas la valeur de retour ont 3 décimales?

Était-ce utile?

La solution

Le résultat de la division du DECIMAL(8,3) par DECIMAL(8,3)gives un type de DECIMAL(20,12) pour voir cette

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

La section BOL qui explique pourquoi decimal(20,12) est

Operation:        e1 / e2
Result precision: p1 - s1 + s2 + max(6, s1 + p2 + 1)
Result scale:     max(6, s1 + p2 + 1)

Donc dans votre cas

Result precision: 8 - 3 + 3 + max(6, 3 + 8 + 1) = 20
Result scale:     max(6, 3 + 8 + 1)             = 12

Autres conseils

Essayez ...

SELECT CAST(DATEDIFF(ms, @processDate, GETDATE()) / 1000.000 AS decimal(8,3))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top