2016-05-18 156 views
0

我正在嘗試在SQL中編寫函數以返回給定日期名稱的最近或最近日期。如何查找給定日期名稱的最近/最近日期

例如,今天是Wed 18/05/16,我想通過函數day ='Mon'period ='next'並返回23/5/16或者day ='Mon'period ='last '16/05/16返回。

我嘗試了以下方法,但似乎太笨重,因爲我仍然需要爲最近日期和下週的日期添加邏輯。

有人能指出我如何最好地接近這個方向嗎?

在此先感謝。

DECLARE @theWeekday VARCHAR(3) = 'Sun'; 
DECLARE @dayDiff INT; 
DECLARE @dayOfWeek TINYINT 
DECLARE @todayOfWeek TINYINT 

--return thursday last week select DATEADD(DAY, ((DATEDIFF(DAY, '19000104', getdate())/7) * 7) hence why i have @dayOfWeekThu 
DECLARE @dayOfWeekThu INT = 4; 

SET @dayOfWeek = CASE @theWeekday 
     WHEN 'Mon' THEN 1 
     WHEN 'Tue' THEN 2 
     WHEN 'Wed' THEN 3 
     WHEN 'Thu' THEN 4 
     WHEN 'Fri' THEN 5 
     WHEN 'Sat' THEN 6 
     WHEN 'Sun' THEN 7 
END 


If @dayOfWeekThu < @dayOfWeek 
BEGIN 
    SET @dayDiff = @[email protected]; 
END 
ELSE 
BEGIN 
    SET @dayDiff = ABS(@[email protected]); 
END 

select DATEADD(DAY, ((DATEDIFF(DAY, '19000104', getdate())/7) * 7) - @dayDiff, '19000104') 

回答

0

我的想法是獲得本週第一天的日期,之後它非常簡單。

declare @wk int 
     ,@yr int 
     ,@Date datetime 
     ,@dayOfWeek int 
     ,@theWeekday VARCHAR(3) = 'fri' 
     ,@Period varchar(10) ='Next' 


    set @yr = year(getdate()) 
    set @wk = DATEPART(wk, getdate())-1 
    set @Date = dateadd (week, @wk, dateadd (year, @yr-1900, 0)) - 4 - 
     datepart(dw, dateadd (week, @wk, dateadd (year, @yr-1900, 0)) - 4) +2 

SET @dayOfWeek = CASE @theWeekday 
     WHEN 'Mon' THEN 0 
     WHEN 'Tue' THEN 1 
     WHEN 'Wed' THEN 2 
     WHEN 'Thu' THEN 3 
     WHEN 'Fri' THEN 4 
     WHEN 'Sat' THEN 5 
     WHEN 'Sun' THEN 6 
     end 


if @Period = 'Next' 
begin 

set @Date = dateadd("dd",@dayOfWeek,dateadd(wk, 1, @Date)) 
end 

else 

begin 
set @Date = dateadd("dd",@dayOfWeek,dateadd(wk, 0, @Date)) 
end 

select @Date 
+0

非常感謝你,那正是我所需要的。 –