2012-01-25 3 views
0

SQL 보고서 sproc의 WHERE 절을 업데이트하여 주어진 날짜가 클래스의 다음 발생 또는 그 이전인지를 확인하려고합니다. 수업에는 StartDate가 있으며 매주 같은 날에 한 주에 한 번씩 열립니다. StartDate가 주어지면 그 요일의 다음 발생을 어떻게 찾을 수 있습니까?SQL에서 다음 요일 찾기 SQL

E.G. StartDate가 2012 년 1 월 18 일과 수요일 인 경우 오늘부터 2012 년 1 월 26 일까지 보고서를 실행합니다. 1/26 이후 다음 수요일 인 2012 년 2 월 1 일을 찾아야합니다. StartDate가 1/19, 목, 오늘 보고서를 실행하면 수식이 오늘 1/26의 나무를 주어야합니다.

다음은 SQL에서 아이디어의 일종 :

SELECT * 
FROM tbl_Class cs 
INNER JOIN tbl_Enrollment sce ON cs.pk_ClassID = sce.fk_ClassID 
WHERE ... 
AND sce.StartDate < [Find date of next class after @AsOfDate using cs.StartDate] 

답변

1

는 여기에 내가 생각 해낸 몇 가지 예를 들어 SQL입니다. 3 번의 반복을 통해 내가 어떻게 끝까지 따라 할 수 있는지 알아보십시오. 세 번째 반복은 변수에 컬럼 이름을 대체하여 WHERE 절에 통합 할 수 있어야합니다.

설정 :

DECLARE @Startdate DATETIME,@currentdate datetime 
SET @Startdate = '1-26-2012' 
SET @Currentdate = '1-23-2012' 

--This section just normalizes it so you can use 7 as the interval 
--The offset depends on your current setting for DATEFIRST, U.S. English default is 7, Sunday. 
-- see http://msdn.microsoft.com/en-us/library/ms187766.aspx 
DECLARE @StartDateWorkingDayOfWeek int,@CurrentDateWorkingDayOfWeek int 
SELECT @StartDateWorkingDayOfWeek =(DATEPART(weekday,@Startdate)-2) 
SELECT @CurrentDateWorkingDayOfWeek=(DATEPART(weekday,@Currentdate)-2) 

반복 # 1

--Iteration 1 
IF @StartDateWorkingDayOfWeek < @CurrentDateWorkingDayOfWeek 
SELECT DATEADD(DAY,DATEDIFF(DAY,0,@Currentdate)/7*7 + 7,@StartDateWorkingDayOfWeek) 
else 
SELECT DATEADD(DAY,DATEDIFF(DAY,0,@Currentdate)/7*7 + 0,@StartDateWorkingDayOfWeek) 

반복 # 2

--Iteration 2 
SELECT DATEADD(DAY,DATEDIFF(DAY,0,@Currentdate)/7*7 + 

CASE WHEN @StartDateWorkingDayOfWeek < @CurrentDateWorkingDayOfWeek 
    then 7 
    ELSE 0 
    end 

    ,@StartDateWorkingDayOfWeek) 

반복 # 3

--iteration 3 
SELECT DATEADD(DAY,DATEDIFF(DAY,0,@Currentdate)/7*7 + 

CASE WHEN (DATEPART(weekday,@Startdate)-2) < (DATEPART(weekday,@Currentdate)-2) 
    then 7 
    ELSE 0 
    end 

    ,(DATEPART(weekday,@Startdate)-2)) 
이 문서에3210

에서 모자 팁 : http://www.sqlmag.com/article/tsql3/datetime-calculations-part-3

우리는 현재 날짜의 이전 월요일 독점의 날짜를 얻을 수 있습니다 (다음은 http://www.sqlmag.com/article/tsql3/datetime-calculations-part-3

+0

'DATEPART (WEEKDAY'은 (http://stackoverflow.com/a/5984859/73226) –

+0

내 미국/영어 중심 다움 파업 다시! 감사합니다, 마틴 [@@ DATEFIRST''에 따라 달라집니다] – TetonSig

+0

나는 똑같은 것을 지적하려고했는데, 2를 빼는 것은 @@ datefirst가 7로 설정되어 있다고 가정한다. 그 전제를 제 자리에 둔다면 나는 이것이 효과가 있다고 생각한다. , @@ datefirst에 대한 의존성을 없애고 조건문을 필요로하지 않는 또 다른 해결책을 발견했다고 생각합니다.이 워크샵과 링크를 이용해 주셔서 대단히 감사합니다. 어느 것을 사용할지는 아마도 개인적인 취향에 달려 있습니다. – xr280xr

0

내가 TetonSig 덕분에이 링크에 그의 참조하여 와서 무엇 @AsOfDate) 이렇게 :

SELECT DATEADD(day, DATEDIFF(day,0, @AsOfDate-1) /7*7, 0); 

이것은 1/1/1900과 @AsOfDate 사이의 일 수를 가져옵니다./7 * 7은이를 주 전체로 변환 한 다음 1900 년 1 월 1 일 (월)까지 다시 추가하여 @AsOfDate 이전의 월요일을 얻습니다. -1을 지정하면 @AsOfDate가 제외됩니다. 마이너스 1이 없으면 @AsOfDate가 월요일에 있었다면 "이전"월요일로 계산됩니다.

다음으로 저자가이 포함 된 다음 월요일 얻을 보여줍니다, 우리는 단순히 독점 이전 월요일 공식 7을 추가해야

SELECT DATEADD(d, DATEDIFF(day,0, @AsOfDate-1) /7*7, 0)+7; 

짜잔를! 우리는 이제 @AsOfDate 이후의 첫 번째 월요일을 받았습니다. 유일한 문제는 위의 월요일 (0)이 제 경우의 움직이는 표적이라는 것입니다. 첫 번째 월요일이 아닌 수업 일로 결정된 첫 번째 [DayOfWeek]가 필요합니다. 나는 위의 0에 대한 ClassDayOfWeek 계산을 교체해야합니다

DATEADD(d, DATEDIFF(d, [ClassDayOfWeek], @AsOfDate-1)/7*7, [ClassDayOfWeek])+7 

나는에 의존하거나 DATEFIRST @@ 설정 엉망으로하지 않고 ClassDayOfWeek을 계산하고 싶었다. 그래서 기본 날짜는 상대적으로 계산 : 일이 그래서 우리는 지금 [ClassDayOfWeek]에 대한 것을에 연결할 수에 대한

DATEDIFF(d, 0, StartDate)%7 

이 월, 6 0을 제공합니다.이 0-6 값은 1/1/1900-1/7/1900이 int로 표시된 날짜임을 지적해야합니다.

DATEADD(d, DATEDIFF(d, DATEDIFF(d, 0, StartDate)%7, @AsOfDate-1)/7*7, DATEDIFF(d, 0, StartDate)%7)+7 

그리고 질문에 따라 사용

는 :

SELECT * 
FROM tbl_Class cs 
INNER JOIN tbl_Enrollment sce ON cs.pk_ClassID = sce.fk_ClassID 
WHERE ... 
AND sce.StartDate < DATEADD(d, 
          DATEDIFF(d, 
            DATEDIFF(d, 0, cs.StartDate)%7, 
            @AsOfDate-1)/7*7, 
          DATEDIFF(d, 0, cs.StartDate)%7)+7 
0

나는 간단한 경우 문 답을 산출했다.
상황에 따라 @targetDOW가 클래스의 요일이됩니다.

DECLARE @todayDOW INT = DATEPART(dw, GETDATE()); 
DECLARE @diff INT = (@targetDOW - @todayDOW); 

SELECT 
    CASE 
     WHEN @diff = 0 THEN GETDATE() 
     WHEN @diff > 0 THEN DATEADD(d,@diff,GETDATE()) 
     WHEN @diff < 0 THEN DATEADD(d,@diff + 7,GETDATE()) 
    END;