내가 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
'DATEPART (WEEKDAY'은 (http://stackoverflow.com/a/5984859/73226) –
내 미국/영어 중심 다움 파업 다시! 감사합니다, 마틴 [@@ DATEFIRST''에 따라 달라집니다] – TetonSig
나는 똑같은 것을 지적하려고했는데, 2를 빼는 것은 @@ datefirst가 7로 설정되어 있다고 가정한다. 그 전제를 제 자리에 둔다면 나는 이것이 효과가 있다고 생각한다. , @@ datefirst에 대한 의존성을 없애고 조건문을 필요로하지 않는 또 다른 해결책을 발견했다고 생각합니다.이 워크샵과 링크를 이용해 주셔서 대단히 감사합니다. 어느 것을 사용할지는 아마도 개인적인 취향에 달려 있습니다. – xr280xr