SQL Server signifikante Ziffern
-
27-10-2019 - |
Frage
Ich habe eine Variable, die maximal 5 links von der Dezimalstelle und immer 3 rechts von der Dezimalstelle zurückgeben soll.
CONVERT(VARCHAR(14),CONVERT(DECIMAL(8,3),
DATEDIFF(MILLISECOND,@ProcessTime,GETDATE()))/@OneThousand)
Jetzt werden Variablen als definiert
DECLARE @ProcessTime DATETIME
DECLARE @OneThousand DECIMAL(8,3)
SET @OneThousand = 1000.000
Dies gibt immer so etwas wie zurück
0.003000000000
Ich denke, ich kann mein Problem mit einer linken Funktion lösen, aber meine Frage ist, warum dies überhaupt passiert.Wenn die minimale definierte Dezimalvariable, @OneThousand
, 3 ist, sollte der Rückgabewert nicht 3 Dezimalstellen haben?
Lösung
Das Ergebnis der Division von DECIMAL(8,3)
durch DECIMAL(8,3)
gibt einen Datentyp von DECIMAL(20,12)
an, um dies zu sehen
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
Der BOL-Abschnitt, in dem erläutert wird, warum decimal(20,12)
hier ist
Operation: e1 / e2
Result precision: p1 - s1 + s2 + max(6, s1 + p2 + 1)
Result scale: max(6, s1 + p2 + 1)
Also in Ihrem Fall
Result precision: 8 - 3 + 3 + max(6, 3 + 8 + 1) = 20
Result scale: max(6, 3 + 8 + 1) = 12
Andere Tipps
Versuchen Sie ...
SELECT CAST(DATEDIFF(ms, @processDate, GETDATE()) / 1000.000 AS decimal(8,3))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow