Sql Server значимые цифры - PullRequest
       45

Sql Server значимые цифры

1 голос
/ 29 апреля 2011

У меня есть переменная, которую я хочу вернуть максимум 5 слева от десятичной дроби и всегда 3 справа

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

Теперь переменные определены как

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

Это всегда возвращает что-то вроде

0.003000000000

Я думаю, я могу решить мою проблему с левой функцией, но мой вопрос, почему это вообще происходит.Если задана минимальная десятичная переменная, @OneThousand, равна 3, не должно ли возвращаемое значение иметь 3 знака после запятой?

Ответы [ 2 ]

2 голосов
/ 29 апреля 2011

Результат деления DECIMAL(8,3) на DECIMAL(8,3) дает тип данных DECIMAL(20,12), чтобы увидеть это

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, объясняющий, почему decimal(20,12) здесь

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

Так в вашем случае

Result precision: 8 - 3 + 3 + max(6, 3 + 8 + 1) = 20
Result scale:     max(6, 3 + 8 + 1)             = 12
1 голос
/ 30 апреля 2011

Попробуйте ...

SELECT CAST(DATEDIFF(ms, @processDate, GETDATE()) / 1000.000 AS decimal(8,3))
...