This should fo the trick for you:
-- Set year in a variable
DECLARE @Year int
SET @Year = 2010
;WITH Months AS (
-- Create a month numbers CTE
SELECT 1 AS MonthNumber
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
),
Dates AS (
-- Find first day of month
SELECT monthNumber,
firstDayOfMonth = DATEADD(month, monthNumber - 1, CONVERT(datetime, CAST(@Year as char(4)) + '0101', 112))
FROM Months
),
MonthRange AS (
-- Find last day of month
SELECT *, lastDayOfMonth = (
SELECT TOP 1
DATEADD(day, -1, firstDayOfMonth)
FROM Dates
WHERE MonthNumber = D.MonthNumber + 1
)
FROM Dates AS D
WHERE monthNumber <= 12
)
SELECT *, firstSunday = (
SELECT TOP 1
DATEADD(day, monthNumber -1, firstDayOfMonth)
FROM Months
WHERE DATEPART(weekday, DATEADD(day, monthNumber -1, firstDayOfMonth)) = 1
ORDER BY monthNumber
),
lastSaturday = (
SELECT TOP 1
DATEADD(day, (-1) * (monthNumber -1), lastDayOfMonth)
FROM Months
WHERE DATEPART(weekday, DATEADD(day, (-1) * (monthNumber -1), lastDayOfMonth)) = 7
ORDER BY monthNumber
)
FROM MonthRange
Hope this helps
Gianluca
-- Gianluca Sartori