Dígitos significativos del servidor SQL
-
27-10-2019 - |
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?
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