2016-05-18 157 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

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