1

ユーザーの選択に応じて、x日ごとにx週間ごとに繰り返されるSQLクエリを作成しようとしています。したがって、ユーザーは、ジョブを 2 週間ごとの火曜日に繰り返すことを選択します。提供される値は次のとおりです。

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 @NextOccurance = (Convert(char(12),@StartDate + (@RecurrenceValue1),106))

しかし、曜日にロールオンする方法がわからないので、@ startDate が今日で、火曜日に 2 週間ごとに繰り返す必要がある場合、今日の 2 週間が水曜日であることがわかり、それがわかるまでループしますその日が火曜日で、それが @NextRecurrance の日付になります。

前もって感謝します

4

3 に答える 3

2

日付に週数を追加する簡単な方法は、(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)
于 2011-12-16T16:35:52.437 に答える
0

おそらく最善の解決策は、カレンダーテーブルを使用することです。http://web.archive.org/web/20070611150639/http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html

次に、次のようにクエリできます。

SELECT TOP 1 @NextOccurance = Date
FROM CalendarTable
WHERE Date >= DATEADD(week, @recurranceValue1, @StartDate)
AND DateName = @recurranceValue2
于 2011-12-16T16:35:57.150 に答える
0

@DanielMが設定した原則を使用して、クエリに合わせて変更しました。以下を参照してください。

    BEGIN
    SET DATEFIRST 1 --Where 1 = Monday and 7 = Sunday 
    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   
                        -- sets @nextoccurence to next date after x amount of weeks
 SET @NextOccurance = DATEADD(wk, @recurrenceValue1, @StartDate) -- Add on weeks /* Check if our incrementation falls on the correct day - Adjust if needed */ 
                        IF (DATEPART(dw, @NextOccurance) != @recurrenceValue2) 
                        BEGIN  
                        DECLARE @Weekday int = DATEPART(dw, @NextOccurance)      
                        SET @NextOccurance = DATEADD(dd, (@RecurrenceValue2 - @Weekday), @NextOccurance) -- Add to @NextOcurrance the number of days missing to be on the requested day of week
                        END
                    END
于 2011-12-19T11:02:19.743 に答える