这可能对某人有所帮助,如果您想从现在开始获得任意几个月的序数日期,我已经创建了这个函数作为您所有建议的组合:
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
它接收日期和月数,获取您想要的日期和月份的第一天的序数。最后一个找到该月中第一次出现的工作日,然后计算从您的日期开始的任何月份的相应序数日期。
我知道它有很多代码,可能会有所改进,但至少它工作得很好。