日付に週数を追加する簡単な方法は、(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
追加する日数のロジックは次のとおりです。1週間に7日あり、今週の終わりに達するまでに何日かかりますか。この日数を@recurrenceValue2(探している曜日)に追加します。
PS:私の評判のため、2つ以上のハイパーリンクを投稿することはできません。これが、DATEFIRSTURLがプレーンテキストである理由です。
特定の日付を異なる方法で処理できるようにするためのコードを次に示します。このコードは一意の日付にのみ有効ですが。たとえば、1週間全体をスキップする必要がある場合、このコードを使用すると、スキップする週の各日に値を追加する必要があります。一意の日以外の範囲の場合、このコードは、日付範囲または特定の週や曜日を処理するように変更する必要があります。
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)