Comment avoir une list d'un jour donné pour les 10 dernières années remplaçant les jours non ouvrables par le lundi le plus proche

Avec ça :

Declare @MyDate Date Set @MyDate = '2017-08-12' 

Je voudrais avoir une table comme celle-ci:

Lorsque les jours non ouvrables sont remplacés par le lundi le plus proche

J'ai une table appelée vacances qui ont seulement les dates que je considère non-affaires. Merci de votre aide.

 DateID Date 1 2016-08-12 2 2015-08-12 3 2014-08-12 4 2013-08-12 5 2012-08-13 6 2011-08-12 7 2010-08-12 8 2009-08-12 9 2008-08-12 10 2007-08-13 

Voici la table des fêtes à considérer comme un samedi ou un dimanche

Holbiz 2016-01-01 2016-02-15 2016-05-30 2016-08-12 2016-08-12 est seulement pour le bien de cet exemple

 declare @d date='20170812'; with a as( select dateadd(yy,-1,@d) d,0 i union all select dateadd(yy,-1,d),i+1 from a where i<9 ), b as(select d,datediff(dd,0,d)%7 dd from a) select iif(dd<5,d,dateadd(dd,7-dd,d)) from b; 

Vérifiez-le .

Je ne sais pas exactement ce que vous voulez, mais si je vous comprends, cela fonctionnera pour vous:

 Declare @MyDate Date; Declare @Temp Table (DateID INT IDENTITY(1,1) , [Date] Date); Declare @Interval int =1; Set @MyDate = '2017-08-12'; while @Interval <= 10 begin if datename(dw,DATEADD(yy , -@interval , @MyDate)) not in ('Sunday' , 'Saturday') insert into @temp([Date]) select DATEADD(yy , -@interval , @MyDate) else if datename(dw,DATEADD(yy , -@interval , @MyDate)) = 'Saturday' insert into @temp([Date]) select DATEADD(DD,2, DATEADD(yy , -@interval , @MyDate) ) else insert into @temp([Date]) select DATEADD(DD,1, DATEADD(yy , -@interval , @MyDate) ) ; set @Interval = @Interval +1; end Select * , datename(dw , [date]) DayName from @Temp; 

Le résultat:

 +--------+---------------------+-----------+ | DateID | Date | DayName | +--------+---------------------+-----------+ | 1 | 12.08.2016 00:00:00 | Friday | | 2 | 12.08.2015 00:00:00 | Wednesday | | 3 | 12.08.2014 00:00:00 | Tuesday | | 4 | 12.08.2013 00:00:00 | Monday | | 5 | 13.08.2012 00:00:00 | Monday | | 6 | 12.08.2011 00:00:00 | Friday | | 7 | 12.08.2010 00:00:00 | Thursday | | 8 | 12.08.2009 00:00:00 | Wednesday | | 9 | 12.08.2008 00:00:00 | Tuesday | | 10 | 13.08.2007 00:00:00 | Monday | +--------+---------------------+-----------+