我想根据月份的星期和星期几使用以下函数来安排每月发生的俱乐部会议。在下面的例子中,我有一个(将)函数返回该月的第三个星期三。如果那一天发生在过去,那么它将返回下个月的第三个星期三。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