Простой способ добавить количество недель к дате - использовать ( 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 гиперссылок из-за своей репутации. Вот почему URL DATEFIRST находится в текстовом формате.
Вот код, позволяющий по-разному обрабатывать определенную дату. Хотя этот код хорош только для уникальных дат. Например, если нужно пропустить целую неделю, использование этого кода потребует добавления значений для каждого дня этой недели, чтобы пропустить. Для диапазонов, отличных от уникальных дней, этот код следует изменить для обработки диапазонов дат или определенных недель и / или дней недели.
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)