كيفية الحصول على الرقم في أشهر بين تواريخين في SQL Server 2005

StackOverflow https://stackoverflow.com/questions/2054975

سؤال

لديّ عمود في جدول SQL Server 2005 الذي يجب أن يحمل عدد الأشهر التي كان فيها الموظف في الخدمة.

نظرًا لأن لدي أيضًا تاريخ انخراط الموظف ، فأنا أريد أن يكون عمود "knows_in_service" عمودًا محسوبًا.

الآن إذا استخدمت DATEDIFF(month,[DateEngaged],GETDATE()) كصيغة للأشهر في العمود المحسوب في الخدمة ، تكون النتائج صحيحة في بعض الأحيان وأحيانًا غير صحيحة.

ما هي الطريقة الأفضل للموثوقية للحصول على عدد الأشهر بين قيمة DateEngaged والتاريخ الحالي؟ ما هي الصيغة التي يجب أن أستخدمها في العمود المحسوب؟

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

المحلول

شيء مثل (قد يحتاج إلى مبادلة 1 و 0 ، لم يتم اختباره)

datediff(month,[DateEngaged],getdate()) +
 CASE WHEN DATEPART(day, [DateEngaged]) < DATEPART(day, getdate()) THEN 1 ELSE 0 END

Datediff قياس الحدود الشهر على سبيل المثال 00:00 الوقت في الأول من كل شهر ، وليس ذكرى الذكرى السنوية

تحرير: بعد رؤية تعليق OP ، يجب عليك طرح 1 إذا كان يوم البدء> نهاية اليوم

DATEDIFF (month, DateEngaged, getdate()) -
 CASE
   WHEN DATEPART(day, DateEngaged) > DATEPART(day, getdate()) THEN 1 ELSE 0
 END

لذلك في 20 ديسمبر إلى 13 يناير ، يعطي Datediff 1 ثم 20> 13 لذا قم بطرح 1 = صفر أشهر.

نصائح أخرى

نفس النهج مثل GBN ، ولكن مع ضغطات مفاتيح أقل :-)

SELECT 
    DATEDIFF(MONTH, DateEngaged, GETDATE()) +
    CASE 
        WHEN DAY(DateEngaged) < DAY(GETDATE())
        THEN 1 
        ELSE 0 
    END

ربما تريد شيئًا مثل:

(year(getdate())-year([DateEngaged]))*12+(month(getdate())-month([DateEngaged]))

إذا افترضت أن هذا الشهر يعني لمدة 30 يومًا ، فيمكنك أيضًا تقريب Vale

round((datediff(day,[DateEngaged],getdate()))/30.00,0)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top