これは、次のように呼び出すと次の土曜日を返す関数です:
SELECT dbo.fn_Get_NextWeekDay('2011-08-08', 6)
プレ>「6」は、可能な値のリスト に由来します。
DATEFIRST
に設定できます .2 番目のパラメーターを適切に変更することで、他の曜日を取得できます。
これが関数です:
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
プレ>