Sql Server chiffres significatifs
-
27-10-2019 - |
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?
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