Sql Server cifre significative
-
27-10-2019 - |
Domanda
Ho una variabile che voglio tornare un max di 5 a sinistra del separatore decimale e sempre 3 a destra
CONVERT(VARCHAR(14),CONVERT(DECIMAL(8,3),
DATEDIFF(MILLISECOND,@ProcessTime,GETDATE()))/@OneThousand)
Ora le variabili sono definite come
DECLARE @ProcessTime DATETIME
DECLARE @OneThousand DECIMAL(8,3)
SET @OneThousand = 1000.000
Questo restituisce sempre qualcosa di simile
0.003000000000
Credo di poter risolvere il mio problema con una funzione sinistra, ma la mia domanda è, perché questo succede a tutti.Se il Minimo variabile decimale definito, @OneThousand
, 3 non il valore di ritorno hanno 3 cifre decimali?
Soluzione
Il risultato della divisione di DECIMAL(8,3)
da DECIMAL(8,3)
dà un tipo di dati di DECIMAL(20,12)
per vedere questo
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
BOL sezione che spiega perché decimal(20,12)
è qui
Operation: e1 / e2
Result precision: p1 - s1 + s2 + max(6, s1 + p2 + 1)
Result scale: max(6, s1 + p2 + 1)
Quindi nel tuo caso
Result precision: 8 - 3 + 3 + max(6, 3 + 8 + 1) = 20
Result scale: max(6, 3 + 8 + 1) = 12
Altri suggerimenti
Prova ...
SELECT CAST(DATEDIFF(ms, @processDate, GETDATE()) / 1000.000 AS decimal(8,3))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow