احتساب ايام العطل او الدوام بين تاريخين
Posted by admin | Posted in SQL server | Posted on 30-12-2009
Tagged Under : SQL server
منذ اسبوع احتجت الى سكريبت لاحتساب ابام الدوام بين تاريخين فوجدت عندي سكريبت يقوم بهذا الاحتساب لكنه يعتمد على ان ايام العطل هي السبت والاحد ولحسن الحظ كان هذا مناسبا وكافيا لما احتاجه ومضطر عليه ذلك الوقت .
لكن في هذا اليوم ساقدم لكم سكريبت ابسط بحيث يمكن اختيار ايام العطل بشكل مختلف (وهذا السكريبت بالاعتماد على التدوينة Get Date of All Weekdays or Weekends of the Year ) وهذا هو السكريبت
DECLARE @StartDate DATETIME, @EndDate DATETIMESELECT @StartDate = '20100101' --اول تاريخSELECT @EndDate = '20100131' --آخر تاريخ;WITH cte AS (SELECT 1 AS DayID,@StartDate AS FromDate,DATENAME(dw, @StartDate) AS DaynameUNION ALLSELECT cte.DayID + 1 AS DayID,DATEADD(d, 1 ,cte.FromDate),DATENAME(dw, DATEADD(d, 1 ,cte.FromDate)) AS DaynameFROM cteWHERE DATEADD(d,1,cte.FromDate) < @EndDate)SELECT FromDate AS Date, DaynameFROM CTEWHERE DayName IN ('Friday','Saturday')OPTION (MaxRecursion 370)
حيث يقوم هذا السكريبت بعرض ايام العطل في شهر كانون الثاني /يناير (ايام العطل في هذا السكريبت هي الجمعة والسبت ويمكن تغييرها بسهولة من اخر جملة).
لعرض عددايام العطل فقط نغير في جملة Select الاخيرة كمايلي :
SELECT Count(*)FROM CTEWHERE DayName IN ('Friday','Saturday')OPTION (MaxRecursion 370)
لعرض عدد ايام الدوام
SELECT Count(*)FROM CTEWHERE DayName not IN ('Friday','Saturday')OPTION (MaxRecursion 370)
فكما نرى يمكن الاعتماد على هذا السكريبت في اخراج الايام المحددة كما نريدها وبسهولة .
ملاحظة : اذا كان الاحتساب لمدة طويلة اكبر من سنة() يجب زيادة OPTION (MaxRecursion 370) الى رقم اعلى بحيث يكون اكبر من عدد الايام المتوقع .




