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?

War es hilfreich?

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