SQL pour exclure les jours fériés, les week-ends et les jours futurs

J'ai créé une procédure stockée comme ci-dessous:

ALTER PROCEDURE reminders AS BEGIN SET NOCOUNT ON; DECLARE @MyDate DATE, @FirstDate DATE, @LastDate DATE SELECT @MyDate = Getdate() SELECT @FirstDate = CONVERT(VARCHAR(25), Dateadd(dd, -( Day(@mydate) - 1 ), @mydate), 100), @LastDate = CONVERT(VARCHAR(25), Dateadd(dd, -( Day( Dateadd(mm, 1, @mydate)) ), Dateadd(mm, 1, @mydate)), 100) DECLARE @AllDates TABLE ( datevalue DATE ) DECLARE @Lastday INT SET @Lastday = Datepart(d, @LastDate) DECLARE @Days INT SET @Days = 1 WHILE @Days <= @Lastday BEGIN INSERT INTO @AllDates SELECT @FirstDate SET @FirstDate = Dateadd(d, 1, @FirstDate) SET @Days = @Days + 1 END SELECT AD.datevalue FROM @AllDates AD LEFT OUTER JOIN EmpLog EL ON AD.datevalue = EL.Date LEFT OUTER JOIN holiday H ON AD.datevalue = H.Date WHERE EL.Date IS NULL AND H.Date IS NULL AND DATENAME(dw,AD.DateValue) NOT IN ('Saturday','Sunday') END 

Ce que je dois avoir c'est que la sortie ne devrait pas inclure les jours futurs. Ex Date aujourd'hui est 12-21-2012 , la sortie de ce code comprend 12-22-2012 au 31-12-2012, et aussi, je veux que le code de sortie 16 jours seulement avant la date actuelle. Ex. La date d'aujourd'hui est le 12-21-2012 donc la sortie de ce code sera du 30 novembre au 21 décembre excluant les vacances et week-ends.

Je vous remercie

Justine – Utilisez cette procédure. Il accepte la date de début et la date de fin comme parameters d'input. Il vous donnera les résultats souhaités entre ces 2 dates.

 ALTER PROCEDURE reminders @FirstDate DATE, @LastDate DATE AS BEGIN SET NOCOUNT ON; DECLARE @AllDates TABLE ( datevalue DATE ) WHILE @FirstDate <= @Lastdate BEGIN INSERT INTO @AllDates SELECT @FirstDate SET @FirstDate = Dateadd(d, 1, @FirstDate) END SELECT AD.datevalue FROM @AllDates AD LEFT OUTER JOIN EmpLog EL ON AD.datevalue = EL.Date LEFT OUTER JOIN holiday H ON AD.datevalue = H.Date WHERE EL.Date IS NULL AND H.Date IS NULL AND DATENAME(dw,AD.DateValue) NOT IN ('Saturday','Sunday') END 

Raj

Dans SQLServer2005 + utilisez le CTE récursif

 ALTER PROCEDURE reminders AS BEGIN SET NOCOUNT ON; DECLARE @MyDate date = GETDATE() ;WITH cte AS ( SELECT @MyDate AS datevalue, 1 AS [count_all_days], CASE WHEN DATENAME(dw, DATEADD(dd, - 1, @MyDate)) IN ('Saturday', 'Sunday') THEN 1 ELSE 0 END AS [count_week_days] UNION ALL SELECT DATEADD(dd, - [count_all_days], @MyDate), [count_all_days] + 1, CASE WHEN DATENAME(dw, DATEADD(dd, - [count_all_days], @MyDate)) IN ('Saturday', 'Sunday') THEN [count_week_days] + 1 ELSE [count_week_days] END FROM cte WHERE [count_all_days] - [count_week_days] < 16 ) SELECT AD.datevalue FROM cte AD LEFT JOIN EmpLog EL ON AD.datevalue = EL.Date LEFT JOIN holiday H ON AD.datevalue = H.Date WHERE EL.Date IS NULL AND H.Date IS NULL AND DATENAME(dw, AD.DateValue) NOT IN ('Saturday', 'Sunday') END