2017-08-12 16 views
2

有了這個:如何有某一天的名單在過去的10年來最接近的替代非工作日週一

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

我想獲得一個像這樣的表:

其中非工作日由最近的星期一

取代我有一個表稱爲假期只具有中的DAT我認爲這是非業務性的。感謝您的幫助。

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 

這裏被認爲是假期表像一個週六或週日

Holbiz 2016-01-01 2016-02-15 2016-05-30 2016-08-12 2016年8月12日僅僅是在這個例子中

+0

實際上,您是否想要給定日期的最近的星期一? – Bohemian

+0

當它是一個星期六,一個星期天或包括在我的假期表中;否則,我想要實際的一天 – Rich

回答

2
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; 

Check it

+0

完美的作品。現在,如果結果中的其中一個日期包含在我的假期表中,如: 讓我們2016-08-12星期五在我的假期表中,我如何將它替換爲2016-08-15星期一? – Rich

+0

@我認爲^是另一個問題,不是嗎? – Sami

+0

如果我可以在查詢中插入一條語句,以確保結果不在假日表中,該表將成爲同一查詢的一部分。 – Rich

0

不知道你想要什麼的緣故,但如果我理解你,這會爲你工作:

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 , [email protected] , @MyDate)) not in ('Sunday' , 'Saturday') 
    insert into @temp([Date]) select DATEADD(yy , [email protected] , @MyDate) 
     else 
     if datename(dw,DATEADD(yy , [email protected] , @MyDate)) = 'Saturday' 
      insert into @temp([Date]) select DATEADD(DD,2, DATEADD(yy , [email protected] , @MyDate)) 
       else 
       insert into @temp([Date]) select DATEADD(DD,1, DATEADD(yy , [email protected] , @MyDate)) ; 
    set @Interval = @Interval +1; 
end 
Select * , datename(dw , [date]) DayName from @Temp; 

結果:

+--------+---------------------+-----------+ 
| 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 | 
+--------+---------------------+-----------+ 
+0

沒有循環沒有解決方案? 這是一般的想法,加上我需要添加一個語句來考慮如果日期包含在節假日表中,我添加1天然後重新循環。正確? – Rich

相關問題