我想根據月份的星期和星期幾使用以下函數來安排每月發生的俱樂部會議。在下面的例子中,我有一個(將)函數返回該月的第三個星期三。如果那一天發生在過去,那麼它將返回下個月的第三個星期三。SQL第一週的第N個月的第N天
我想擺脫循環,我覺得有一個更好的計算方法。還有更多面向對象的過程嗎?你的意見?
--CREATE FUNCTION NextWeekDayofMonth
DECLARE
--(
@WEEK INT,
@WEEKDAY INT,
@REFERENCEDATE DATETIME
--)
--RETURNS DATETIME
--AS
-------------------------------
--Values for testing - Third Wednesday of the Month
set @WEEK = 3 --Third Week
set @WEEKDAY = 4 --Wednesday
set @REFERENCEDATE = '08/20/2011'
-------------------------------
BEGIN
DECLARE @WEEKSEARCH INT
DECLARE @FDOM DATETIME
DECLARE @RETURNDATE DATETIME
SET @FDOM = DATEADD(M,DATEDIFF(M,0,@REFERENCEDATE),0)
SET @RETURNDATE = DATEADD(M,0,@FDOM)
WHILE (@RETURNDATE < @REFERENCEDATE)
--If the calculated date occurs in the past then it
--finds the appropriate date in the next month
BEGIN
SET @WEEKSEARCH = 1
SET @RETURNDATE = @FDOM
--Finds the first weekday of the month that matches the provided weekday value
WHILE (DATEPART(DW,@RETURNDATE) <> @WEEKDAY)
BEGIN
SET @RETURNDATE = DATEADD(D,1,@RETURNDATE)
END
--Iterates through the weeks without going into next month
WHILE @WEEKSEARCH < @WEEK
BEGIN
IF MONTH(DATEADD(WK,1,@RETURNDATE)) = MONTH(@FDOM)
BEGIN
SET @RETURNDATE = DATEADD(WK,1,@RETURNDATE)
SET @WEEKSEARCH = @WEEKSEARCH+1
END
ELSE
BREAK
END
SET @FDOM = DATEADD(M,1,@FDOM)
END
--RETURN @RETURNDATE
select @ReturnDate
END
簽出以下帖子,它看起來可以幫助你:[計算一個月中的第N個工作日](http://blogs.lessthandot.com/index.php/DataMgmt/DBProgramming/calculating-nth-weekday-in一個月) – jdavies
可能的重複[使用T-SQL獲取下個月的第一個星期天](http://stackoverflow.com/questions/1506036/get-first-sunday-of-next-month-using-t- sql) – Hogan
jdavies - 偉大的鏈接。我會在筆記本電腦上添加您的和貓的解決方案。 – Pete