一个简单的方法来增加一个日期的周数是使用 ( MSDN DATEADD )
DATEADD(wk, @StartDate, @recurrenceValue1)
要找出您正在查看的日期属于一周中的哪一天,您可以使用 ( MSDN DATEPART )
DATEPART(dw, @StartDate)
此函数使用 DATEFIRST 确定一周中的哪一天是第一天 (http://msdn.microsoft.com/en-us/library/ms181598.aspx)
SET DATEFIRST 1 --Where 1 = Monday and 7 = Sunday
因此,对于您的问题(DATEFIRST 设置为 1 = 星期一)..
SET DATEFIRST 1
declare @StartDate datetime -- when the job first recurs
declare @recurrenceValue1 int -- amount of weeks
declare @recurrenceValue2 int -- day of week (mon-sun)
declare @NextOcurrance datetime -- when the job will recur
SET @StartDate = '2011-12-16' -- This is a Friday
SET @recurrenceValue1 = 2 -- In 2 weeks
SET @recurrenceValue2 = 2 -- On Tuesday
SET @NextOcurrance = DATEADD(wk, @recurrenceValue1, @StartDate) -- Add our 2 weeks
/* Check if our incrementation falls on the correct day - Adjust if needed */
IF (DATEPART(dw, @NextOcurrance) != @recurrenceValue2) BEGIN
DECLARE @weekDay int = DATEPART(dw, @NextOcurrance)
SET @NextOcurrance = DATEADD(dd, ((7 - @weekDay) + @recurrenceValue2), @NextOcurrance) -- Add to @NextOcurrance the number of days missing to be on the requested day of week
END
添加天数的逻辑如下:我们一周有7天,到这个周末需要多少天。将此天数添加到@recurrenceValue2(我们正在寻找的星期几)。
PS:由于我的声誉,我不能发布超过 2 个超链接。这就是为什么 DATEFIRST URL 是纯文本的原因。
这里有一些代码允许以不同的方式处理某些特定日期。尽管此代码仅适用于唯一日期。例如,如果需要跳过一整周,则使用此代码将需要为本周的每一天添加值以跳过。对于唯一日期以外的范围,应修改此代码以处理日期范围或特定星期和/或星期几。
CREATE TABLE OccurenceExclusions (
ExclusionDate DATE not null,
NumberOfDaysToAdd int not null
PRIMARY KEY (ExclusionDate)
)
INSERT OccurenceExclusions VALUES ('2012-01-01', 7)
SET @NextOcurrance = DATEADD(dd, COALESCE((SELECT NumberOfDaysToAdd
FROM OccurrenceExclusions
WHERE ExclusionDate = @NextOcurrance), 0), @NextOcurrance)