2011-12-14 4 views
1

사용자가 선택한 항목에 따라 매 x 일마다 매 x 반복되는 SQL 쿼리를 작성하려고합니다.SQL x 주마다 x 평일 반복 됨

SET @NextOccurance = (Convert(char(12),@StartDate + (@RecurrenceValue1),106)) 
: 그래서 사용자들은 제공되는 값은
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 

내가 주의 양을 설정하는 방법을 알고 있습니다 매 2 주 화요일에 재발하는 작업을 원하는 선택합니다

하지만 오늘 주일로 돌릴 수있는 방법을 모르겠습니다. 따라서 @startDate가 오늘이고 화요일에 2 주마다 반복되어야합니다. 오늘 2 주간은 수요일이므로 순환 될 것입니다. 그날이 화요일임을 알리면 @NextRecurrance 날짜가됩니다. 사전

+0

인가? –

+0

안녕하세요, 그렇습니다 - sqlserver2008을 사용 중입니다 – anna

+0

화요일 _'fore Wednesday + 2 weeks '또는 화요일 _after_after Wednesday + 2 weeks?를 원하십니까?누군가가 화요일에 첫 번째 '되풀이'날짜를 가졌지 만 그 요일이 수요일로되어 있다면 그 변화가 발생합니까? 함수를 작성하려고하거나 스케줄링 서비스 용 데이터를 저장하려고합니까? 그렇다면 스키마는 무엇이며 변경할 수 있습니까? –

답변

2

날짜에 주 번호를 추가하는 쉬운 방법

덕분에 (MSDN DATEADD)

DATEADD(wk, @StartDate, @recurrenceValue1) 

날짜 당신이보고되는 요일을 확인하려면 사용하는 것입니다 당신이 기능은 첫 번째 (http://msdn.microsoft는 요일 결정 DATEFIRST를 사용 (MSDN DATEPART)

DATEPART(dw, @StartDate) 

사용할 수 있습니다에 속한다. COM/EN-US/라이브러리/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에이 일수를 추가하십시오 (우리가 찾고있는 요일).

추신 : 내 평판 때문에 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) 
+0

+ 1 - 캘린더 파일이 좋은 아이디어이며 믿을 수 없을만큼 유용하다고 생각합니다. 이는 멋진 단순 솔루션입니다. 물론, 이는 특정 일 (화요일이 휴일 인 경우)을 배제하는 것을 배제하지만, 그렇지 않은 경우에는 완벽하게 작동합니다. –

+0

이 코드에 대한 좋은 점은 동적이며 DATEADD 함수를 사용하기 때문에 윤년, 30 대 31 개월 등을 자동으로 처리한다는 것입니다. 저장된 정보가있는 '제외'테이블과 결합 될 수 있습니다. 년, 월, 주 번호 및 요일이 발생해야합니다. 나는 그 사건을 다루기 위해 몇 가지 코드를 추가 할 것이다. – DanielM

+0

휴일이 문제가되면 그는 @ Stuart의 대답처럼 캘린더 테이블을 사용해야합니다. 두 버전을 섞어서는 안됩니다. –

0

난 내 쿼리는 아래를 참조 맞도록 변경이 SQLServer에이

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 
관련 문제