منذ اسبوع احتجت الى سكريبت لاحتساب ابام الدوام بين تاريخين فوجدت عندي سكريبت يقوم بهذا الاحتساب لكنه يعتمد على ان ايام العطل هي السبت والاحد ولحسن الحظ كان هذا مناسبا وكافيا لما احتاجه ومضطر عليه ذلك الوقت .
لكن في هذا اليوم ساقدم لكم سكريبت ابسط بحيث يمكن اختيار ايام العطل بشكل مختلف (وهذا السكريبت بالاعتماد على التدوينة Get Date of All Weekdays or Weekends of the Year ) وهذا هو السكريبت
DECLARE @StartDate DATETIME, @EndDate DATETIME
SELECT @StartDate = '20100101' --اول تاريخ
SELECT @EndDate = '20100131' --آخر تاريخ
;WITH cte AS (
SELECT 1 AS DayID,
@StartDate AS FromDate,
DATENAME(dw, @StartDate) AS Dayname
UNION ALL
SELECT cte.DayID + 1 AS DayID,
DATEADD(d, 1 ,cte.FromDate),
DATENAME(dw, DATEADD(d, 1 ,cte.FromDate)) AS Dayname
FROM cte
WHERE DATEADD(d,1,cte.FromDate) < @EndDate
)
SELECT FromDate AS Date, Dayname
FROM CTE
WHERE DayName IN ('Friday','Saturday')
OPTION (MaxRecursion 370)
حيث يقوم هذا السكريبت بعرض ايام العطل في شهر كانون الثاني /يناير (ايام العطل في هذا السكريبت هي الجمعة والسبت ويمكن تغييرها بسهولة من اخر جملة).
لعرض عددايام العطل فقط نغير في جملة Select الاخيرة كمايلي :
SELECT Count(*)
FROM CTE
WHERE DayName IN ('Friday','Saturday')
OPTION (MaxRecursion 370)
لعرض عدد ايام الدوام
SELECT Count(*)
FROM CTE
WHERE DayName not IN ('Friday','Saturday')
OPTION (MaxRecursion 370)
فكما نرى يمكن الاعتماد على هذا السكريبت في اخراج الايام المحددة كما نريدها وبسهولة .
ملاحظة : اذا كان الاحتساب لمدة طويلة اكبر من سنة() يجب زيادة OPTION (MaxRecursion 370) الى رقم اعلى بحيث يكون اكبر من عدد الايام المتوقع .