簡體   English   中英

在這種情況下,如何從存儲過程返回正確的開始日期值?

[英]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 NameDate其中包含今年的三個記錄:哥倫布日: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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM