2013-04-23 67 views
1

我有一個基於我需要返回上次工作日期的假期表。需要在sql中編寫遞歸日期函數嗎?

Table_holiday 

Id Date  Text 
1 2013-03-29 Good Friday 
2 2013-05-01 Maharashtra day 
3 2013-05-02 Holiday 

當我執行我的date_recursive功能它應該有檢查,並返回我last_business日期

For example

如果我執行它@date datetime = '2013-03-29'它應該返回我last working date '2013-03-28',因爲這是最後的工作日期

任何幫助新手在sql中。

回答

3

請嘗試:

DECLARE @Table_holiday as TABLE(id int, [date] datetime, [Text] nvarchar(50)) 
insert into @Table_holiday values(1, '2013-03-29', 'Good Friday') 
insert into @Table_holiday values(2, '2013-05-01', 'Maharashtra day') 
insert into @Table_holiday values(3, '2013-05-02', 'Holiday') 

declare @date datetime 
set @date ='2013-03-29' 

;with T(dt) as 
(
    select @date union all 
    select T1.[date] from T inner join @Table_holiday T1 on T1.[date]=T.dt-1 
)select min(dt)-1 from T 
+1

請爲此添加示例數據。 – TechDo 2013-04-23 09:51:08

+0

如果我的功能將僅在工作日執行,然後上面的邏輯工作對我罰款:) 代替#TEMP假期表我加入永久假期表:) 感謝techdo 也請添加代碼,如果有什麼事情錯過了 – Neo 2013-04-23 09:52:45

+1

很高興聽到... Thanx。 – TechDo 2013-04-23 09:54:41

0
select (case when DATEDIFF(day,GETDATE(),'2008-08-05')<2 Then "last 
working date" Else "" END) from Table_holiday 

希望它有幫助。

3

假設任何日期而不是在您的假期表中是工作日期,您可以向後搜索,直到找到非假日爲止。

;with cte(adate) as (
    select @date 
    from table_holiday 
    where @date = Date 
    union all 
    select h.Date 
    from cte 
    join table_holiday h on dateadd(d,-1,cte.adate) = h.Date 
) 
select isnull((select dateadd(d,-1,min(adate)) from cte), @date); 
+0

謝謝@RichardTheKiwi請問您可以詳細說明上述CTE日期函數與techdo給出的以下不同之處嗎?我是CTE新手請詳細說明.. – Neo 2013-04-23 09:58:20

+1

techdo的答案也使用CTE,他命名爲「'T」「。他的答案在技術上更好,從你最後一個工作日之後的第二天開始。我認爲@date是最後一個工作日,但如果是假期則會倒退。 'techdo'假設你在** @date之前需要一個工作日**。 – RichardTheKiwi 2013-04-23 09:59:52

+0

非常感謝您的解釋。 – Neo 2013-04-23 10:04:17