2011-08-08 46 views

回答

3

这是,如果你这样称呼它,将返回下周六功能:

SELECT dbo.fn_Get_NextWeekDay('2011-08-08', 6) 

“6” 来自the list of possible values可以为DATEFIRST设置。

您可以通过相应地更改第二个参数来获得任何其他星期几。

这是函数:

IF OBJECT_ID('dbo.fn_Get_NextWeekDay') IS NOT NULL 
    DROP FUNCTION dbo.fn_Get_NextWeekDay 
GO 
CREATE FUNCTION dbo.fn_Get_NextWeekDay(
    @aDate DATETIME 
    , @dayofweek  INT 
    /* 
     @dw - day of the week 
     1 - Monday 
     2 - Tuesday 
     3 - Wednesday 
     4 - Thursday 
     5 - Friday 
     6 - Saturday 
     7 - Sunday 
    */ 
) 
RETURNS DATETIME 
AS 
/* 
    SELECT dbo.fn_Get_NextWeekDay('2011-08-08', 6) 
    SELECT dbo.fn_Get_NextWeekDay('2011-08-08', 1) 
*/ 
BEGIN 
    RETURN 
     DATEADD(day 
     , (@dayofweek + 8 - DATEPART(dw, @aDate) - @@DATEFIRST) % 7 
     , @aDate 
    ) 
END 
GO 

[编辑] 这可能是另一种解决办法。这应该在任何语言工作:

IF OBJECT_ID('dbo.fn_NextWeekDay') IS NOT NULL 
    DROP FUNCTION dbo.fn_NextWeekDay 
GO 
CREATE FUNCTION dbo.fn_NextWeekDay(
    @aDate  DATE 
    , @dayofweek NVARCHAR(30) 
) 
RETURNS DATE 
AS 
/* 
    SELECT dbo.fn_NextWeekDay('2016-12-14', 'fri') 
    SELECT dbo.fn_NextWeekDay('2016-03-15', 'mon') 
*/ 
BEGIN 
    DECLARE @dx INT = 6 
    WHILE UPPER(DATENAME(weekday,@aDate)) NOT LIKE UPPER(@dayofweek) + '%' 
    BEGIN 

    SET @aDate = DATEADD(day,1,@aDate) 

    SET @[email protected] 
    if @dx < 0 
    BEGIN 
     SET @aDate = NULL 
     BREAK 
    END 
    END 

    RETURN @aDate 

END 
GO 
+0

这是一个很好的解决方案,但是是非确定性的,不会在任何语言中工作。 –

+0

对于值dbo.fn_Get_NextWeekDay('2016-12-14',2),该函数在某些配置中返回2016-12-13 00:00:00.000 –

2

使用DATEPART输出到取得今天的一周中的一天,并添加差一周到今天的日期所需天。

3
DECLARE @Today date = 'TODAYS-DATE'; 
DECLARE @TodayNumber int = DATEPART(dw, @Today) -- Get the day number 
DECLARE @Saturday date = DATEADD(DAY, ([email protected])%7, @Today) 
-- Add the number of days between today and saturday (the 6th day), modulus 7 to stop you adding negative days 

希望帮助!

1

试试这个:

SET DATEFIRST 7 
DECLARE @d DATETIME 
SET @d = '2011-08-08' --GETDATE() 

SELECT NEXT_SAT = DATEADD(day, (7 + @@DATEFIRST - DATEPART(dw, @d)) % 7, @d) 
+0

但'SET DATEFIRST 7'这不能是一个SQL函数内使用..西隧做什么? – Sreekumar

+0

SET DATEFIRST的当前值是什么? (选择@@ DATEFIRST) – leoinfo

+0

当前值为7。但它可能会从SYSTEM更改为SYSTEM .. – Sreekumar

2

使用日历表(表,每个日期一行):

SELECT MIN(DateValue) DateValue 
FROM Calendar 
WHERE DateValue >= CURRENT_TIMESTAMP 
AND DayOfWeek = 'Saturday'; 
相关问题