[英]How to return the correct start date value from a stored procedure in this case?
我使用以下 case 條件來計算StartDate
變量:
DECLARE @StartDate Date =
DATEADD(DAY, CASE WHEN DATEPART(dw, GETDATE()) = 2 THEN -10 ELSE -8 END, GETDATE())
如您所見,如果今天的日期是星期一,則從今天的日期中減去 10 天,否則減去 8 天。 由於今天 (10/16/2018) 不是星期一,這將返回 10/8/2018 作為輸出(扣除 8 天)。 如果在星期一 (10/15) 執行,那么@StartDate
將返回 10/5 作為輸出。
我添加了一個名為Holidays
的表,它有兩列Holiday Name
和Date
其中包含今年的三個記錄:哥倫布日:10/8、退伍軍人日 11/12 和感恩節 11/22。
現在我要做的具有挑戰性的部分是,如果@StartDate
的返回輸出是 10/8(今天執行的查詢:10/16)這是一個假期(星期一),那么@StartDate
值應該更改為 10/5 (前一個工作日,周六和周日除外)。 另外如果@StartDate
的值是10/5(查詢在10/15執行),那么這個值應該改為10/4,因為10/8是假期,所以不會被計入10天的扣除而不是 10/5,它應該是 10/4。
所以理論上它應該這樣工作:檢查今天的日期和@StartDate
之間是否有任何假期,如果有,則使用前一天並根據我上面提到的情況相應地調整星期一。
請注意,我在頂部提到的包含語句是存儲過程的一部分。
我該如何完成這項工作,有人可以幫忙嗎? 提前致謝。
假設您的假期中從來沒有連續多個日期,這將在單個(ish)語句中完成。 如果您願意,您可以輕松地將其分為兩部分:
DECLARE @StartDate date
;with d as (
select convert(date,dateadd(day,case when datepart(dw,getdate())=2 then -10 else -8 end,getdate())) dt
)
select @StartDate=case when holiday.date is null then dt else dateadd(day,-1,dt) end
from d
left join holiday on holiday.date=dt
編輯:這是一個完整的工作副本。 我創建了一個表變量來保存假期,運行初始查詢,然后將返回的日期作為假期插入,然后再次運行查詢。 如果您在 sql server 中運行它,您將看到第二個查詢返回第一個查詢的前一天。
declare @holiday table(date date)
DECLARE @StartDate date
;with d as (
select convert(date,dateadd(day,case when datepart(dw,getdate())=2 then -10 else -8 end,getdate())) dt
)
select @StartDate=case when holiday.date is null then dt else dateadd(day,-1,dt) end
from d
left join @holiday holiday on holiday.date=dt
select @startdate
insert @holiday values (@startdate)
;with d as (
select convert(date,dateadd(day,case when datepart(dw,getdate())=2 then -10 else -8 end,getdate())) dt
)
select @StartDate=case when holiday.date is null then dt else dateadd(day,-1,dt) end
from d
left join @holiday holiday on holiday.date=dt
select @startdate
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.