、 、、 、のDates
5 つの列を含むテーブルがあり、将来の日付が入力されている場合は、次の操作を簡単に行うことができます。FullDate
Month
Day
Year
DayOfWeek
@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-(@firstDayInMonthDOW-@DOW))%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-(@corrDOW-@DOW))%7, @corr)
SELECT dateadd(week, @weekInMonth, @corrFirstSameDay)
SQL フィドルの例
少し醜いですが、それは次のとおりです。
@d
intoと同じ曜日の月の最初の日を取得し@firstSameDayInMonth
ます。
@d
0 ベースの整数として、対応する月内で# がどの週にあるかを把握し@weekInMonth
ます。@firstSameDayInMonth
これはとの間の週数です@d
。
- intoと同じ曜日の
@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)))