Since last day of month can vary, the important thing is to get the first day of the current month this year. From that you can calculate the other three values.
You could do this easily with expressions in the parameters' default values instead.
Start of Month
=Today.AddDays(1-Today.Day)
End of Month
=Today.AddDays(1-Today.Day).AddMonths(1).AddDays(-1)
Start of Month Last Year
=Today.AddDays(1-Today.Day).AddYears(-1)
End of Month Last Year:
=Today.AddDays(1-Today.Day).AddYears(-1).AddMonths(1).AddDays(-1)
But if you really want to do it in SQL, you can. Note below I'm describing how to get the start of month and then just using placeholder variables for it in the other expressions for clarity.
--Start of Month
dateadd(month, datediff(month, 0, getdate()), 0)
--End of Month
dateadd(day, -1, dateadd(month, 1, @StartOfMonth))
--Start of Month Last Year
dateadd(year, -1, @StartOfMonth)
--End of Month Last Year
dateadd(day, -1, dateadd(month, 1, @StartOfMonthLastYear))
Those are the pieces. Put them together into one giant, very hard to read select statement like so:
select
dateadd(month, datediff(month, 0, getdate()), 0) StartDate1,
dateadd(day, -1, dateadd(month, 1, dateadd(month, datediff(month, 0, getdate()), 0))) EndDate1,
dateadd(year, -1, dateadd(month, datediff(month, 0, getdate()), 0)) StartDate2,
dateadd(day, -1, dateadd(month, 1, dateadd(year, -1, dateadd(month, datediff(month, 0, getdate()), 0)))) EndDate2
Now you see why I recommend just using internal parameters that can leverage the .NET datetime class methods.