What about:
create function udf_getNextDate(@base datetime, @day int) returns datetime as begin
set @base = case when day(@base) > @day
then dateadd(month, 1, @base)
else @base
end
return dateadd(day, -day(@base) + @day, @base)
end
select
dbo.udf_getNextDate('08 may 2011', 15),
dbo.udf_getNextDate('30 may 2011', 15),
dbo.udf_getNextDate('16 dec 2011', 15),
dbo.udf_getNextDate('01 may 2011', 15)
2011-05-15 00:00:00.000
2011-06-15 00:00:00.000
2012-01-15 00:00:00.000
2011-05-15 00:00:00.000
source
share