это может кому-то помочь, если вы хотите получить порядковую дату через любое количество месяцев, я создал эту функцию как комбинацию всех ваших советов:
CREATE FUNCTION [dbo].[fncSameDayOfWeekAnotherMonth] (@Date datetime, @Months int)
RETURNS datetime
AS BEGIN
declare @FONM datetime, @day TinyInt, @ordinal tinyint, @FDM datetime, @result datetime
Set @FONM = DATEADD(dd,-(DAY(DATEADD(mm,@Months,@Date))-1),DATEADD(mm,@Months,@Date))--first day of month
Set @day = datepart(weekday,@Date)+7
set @ordinal=ceiling( cast(datepart(day,@Date)as float)/7 )--ordinal day
set @FDM = DateAdd(day, ((@day -DatePart(weekday, @FONM))%7), @FONM)--first day of week (monday, friday, etc) on month
set @result = DateAdd(day, (@ordinal-1)*7, @FDM)
RETURN case when DATEDIFF(month, @Date, @result) > @Months then DateAdd(day, (@ordinal-2)*7, @FDM) else @result end --if result exceeds number of months just subtract one week from ordinal
END
он получает дату и количество месяцев, получает порядковый номер дня и первого дня месяца, который вы хотите. С помощью этого последнего можно найти первое вхождение дня недели в этом месяце, а затем вычислить соответствующую порядковую дату в любом месяце с вашей даты.
Я знаю, что в нем много кода и его можно улучшить, но, по крайней мере, он работает довольно хорошо.