Pregunta

Tengo una variable que quiero devolver un máximo de 5 a la izquierda del decimal y siempre 3 a la derecha

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

Ahora las variables se definen como

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

Esto siempre devuelve algo como

0.003000000000

Supongo que puedo resolver mi problema con una función izquierda, pero mi pregunta es por qué sucede esto.Si la variable mínima de decimal definida, @OneThousand, es 3, ¿no debería el valor de retorno tener 3 decimales?

¿Fue útil?

Solución

El resultado de la división de DECIMAL(8,3) por DECIMAL(8,3) da un tipo de datos de DECIMAL(20,12) para ver esto

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 sección BOL que explica por qué decimal(20,12) está aquí

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

Entonces, en tu caso

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

Otros consejos

Prueba ...

SELECT CAST(DATEDIFF(ms, @processDate, GETDATE()) / 1000.000 AS decimal(8,3))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top