당신은 쉽게 다음을 수행 할 수있다. @m
및 @y
가정
는 롤 포워드 할 수있는 사용자 지정 월/년이며, @d
이벤트 날짜 : 당신은 그냥해야 할 것이다하는 날짜 테이블없이
DECLARE @weekNumInMonth int =
(
SELECT COUNT(1)
FROM Dates
WHERE Year = datepart(year @d)
AND Month = datepart(month, @d)
AND DayOfWeek = datepart(weekday, @d)
AND Day <= datepart(day, @d)
)
SELECT MAX(FullDate)
FROM
(
SELECT TOP @weekNumInMonth
FROM Dates
WHERE Year = @y
AND Month = @m
AND DayOfWeek = datepart(weekday, @d)
) x
일부 수학 :
DECLARE @DOW int = datepart(weekday, @d)
DECLARE @firstDayInMonth date = dateadd(day, 1-datepart(day, @d), @d)
DECLARE @firstDayInMonthDOW int = datepart(weekday, @firstDayInMonth)
DECLARE @firstSameDayInMonth date =
dateadd(day, (7-(@[email protected]))%7, @firstDayInMonth)
DECLARE @weekInMonth int = datediff(week, @firstSameDayInMonth, @d)
DECLARE @corr date = datefromparts(@y, @m, 1)
DECLARE @corrDOW int = datepart(weekday, @corr)
DECLARE @corrFirstSameDay date = dateadd(day, (7-(@[email protected]))%7, @corr)
SELECT dateadd(week, @weekInMonth, @corrFirstSameDay)
SQL Fiddle example
이 조금 추한,하지만이 일은이다 :
- 이
@firstSameDayInMonth
에 @d
같은 요일과 달의 첫 날을 가져옵니다.
- 어떤 주 #
@d
이 해당 월에 0- 기준 정수 @weekInMonth
인지를 계산합니다. 이것은 @firstSameDayInMonth
과 @d
사이의 주입니다.
@m
의 첫 번째 날을 @y
과 같은 평일 인 @d
을 @corrFirstSameDay
으로 가져옵니다.
- 결과를 얻으려면 0 단위 숫자
@weekInMonth
부터 @corrFirstSameDay
까지를 추가하십시오.
한 줄로 처리 할 수 있습니까? 물론 변수를 대체하십시오. 하지만 경고, 그것은 추한, 가독성 이럴 부족을 제외하고 그것에서 얻을 수 아무것도 정말 없다 :
SELECT dateadd(week, datediff(week, dateadd(day, (7-(datepart(weekday, dateadd(day,
1-datepart(day, @d), @d))-datepart(weekday, @d)))%7, dateadd(day,
1-datepart(day, @d), @d)), @d), dateadd(day, (7-(datepart(weekday,
datefromparts(@y, @m, 1))-datepart(weekday, @d)))%7, datefromparts(@y, @m, 1)))
어떻게이 사건을 처리 할 할 : 토요일, 주 5 월. 모든 달에는 주 5의 토요일이있는 것은 아닙니다. 그래서 4 주째의 토요일을 사용하고 싶습니까? 나는 단지주의를 기울인다. 당신은 몇 주 지나지 않고 하루 만에 출현한다. 그래서 여전히 같은 원칙, 모든 달이 5 번째 토요일을 갖는 것은 아니기 때문에, 대신에 4 번째 날짜를 사용하고 싶습니다. – SwissCoder
아니요, 그 날은 이제 막 떨어질 것입니다. – user2122092