• 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