Мне потребовалось некоторое время, чтобы понять, что ваши даты были в другом формате, чем я привык.
Я бы использовал общее табличное выражение, а не курсор. Кроме того, рассмотрите разницу в месяце между любой датой и датой начала. Возьмем модуль этой разницы (это символ «%»). Если это 0, то ваш интервал был достигнут, и поэтому активируйте свой флаг.
declare
@startdate date = '04.01.2019',
@interval int = 3; -- or 1, or whatever
with
dates as (
select @startdate dt, 1 flag
union all
select ap.nextDt,
flag =
case
when day(ap.nextDt) <> day(@startdate) then 0
when (month(ap.nextDt) - month(@startdate)) % @interval = 0 then 1
else 0
end
from dates
cross apply (select nextDt = dateadd(day,1,dt)) ap
where dt <= dateadd(year,1,@startdate)
)
select *
from dates
option (maxrecursion 367)