سؤال

لدي متغير أريد إرجاعه بحد أقصى 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 أرقام عشرية؟

هل كانت مفيدة؟

المحلول

نتيجة التقسيم 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

قسم بوليصة التأمين الذي يشرح السبب 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

نصائح أخرى

جرب ... Genacodicetagpre

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top