كيفية الحصول على الرقم في أشهر بين تواريخين في SQL Server 2005
-
20-09-2019 - |
سؤال
لديّ عمود في جدول 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)