with x(dy,mth,is_monday) as ( select dy,mth, case when datepart(dm,dy) = 2 then 1 else 0 end from ( select dateadd(day,1,dateadd(day,-day(getdate()),getdate())) dy, month(getdate()) mth ) tmp1 union all select dateadd(day,1,dy), mth, case when datepart(dw,dateadd(day,1,dy)) = 2 then 1 else 0 end from x where month(dateadd(day,1,dy)) = mth ) select max(dy) last_monday from x where is_monday = 1