Sql Server أرقام مهمة
-
27-10-2019 - |
سؤال
لدي متغير أريد إرجاعه بحد أقصى 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
لا تنتمي إلى StackOverflow