With a few changes you can have up to 12 years.
With a real tally table[/url] you could have all the years you want.
-- Set year in a variable
DECLARE @StartYear int
DECLARE @NumYears int
SELECT @StartYear = 2010, @NumYears = 2
;WITH SmallTally AS (
-- Create a month numbers CTE
SELECT 1 AS N
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7
UNION ALL SELECT 8
UNION ALL SELECT 9
UNION ALL SELECT 10
UNION ALL SELECT 11
UNION ALL SELECT 12
UNION ALL SELECT 13
),
Months AS (
SELECT N AS MonthNumber
FROM SmallTally
),
Years AS (
SELECT @StartYear + N - 1 AS YearNumber
FROM SmallTally
WHERE N <= @NumYears
),
Dates AS (
-- Find first day of month
SELECT monthNumber, YearNumber,
firstDayOfMonth = DATEADD(month, monthNumber - 1, CONVERT(datetime, CAST(YearNumber as char(4)) + '0101', 112))
FROM Months, Years
),
MonthRange AS (
-- Find last day of month
SELECT *, lastDayOfMonth = (
SELECT DATEADD(day, -1, firstDayOfMonth)
FROM Dates
WHERE monthNumber = D.MonthNumber + 1
AND YearNumber = YEAR(D.firstDayOfMonth)
)
FROM Dates AS D
WHERE monthNumber <= 12
)
SELECT *, firstSunday = (
SELECT TOP 1
DATEADD(day, N -1, firstDayOfMonth)
FROM SmallTally
WHERE DATEPART(weekday, DATEADD(day, N -1, firstDayOfMonth)) = 1
ORDER BY N
),
lastSaturday = (
SELECT TOP 1
DATEADD(day, (-1) * (N -1), lastDayOfMonth)
FROM SmallTally
WHERE DATEPART(weekday, DATEADD(day, (-1) * (N -1), lastDayOfMonth)) = 7
ORDER BY N
)
FROM MonthRange
ORDER BY firstDayOfMonth
-- Gianluca Sartori