This SQL statement can generate a calendar by inputting a month and a year.
In my work, I usually need to generate a calendar by inputting a month and a year, so I write the following code to do it.
DECLARE @Month AS INT = 4 --Set the MONTH for which you want to generate the Calendar. DECLARE @Year AS INT = 2013 --Set the YEAR for which you want to generate the Calendar. DECLARE @StartDate AS DATETIME = CONVERT(VARCHAR,@Year) + RIGHT('0' + CONVERT(VARCHAR,@Month),2) + '01' DECLARE @EndDate AS DATETIME = DATEADD(DAY,-1,DATEADD(MONTH,1,@StartDate)); SELECT SUM(CASE WHEN DATEPART(DW, DATEADD(DD,number,@StartDate)) = 1 _ THEN DATEPART(DAY, DATEADD(DD,NUMBER,@StartDate)) END) AS Sunday ,SUM(CASE WHEN DATEPART(DW, DATEADD(DD,number,@StartDate)) = 2 _ THEN DATEPART(DAY, DATEADD(DD,NUMBER,@StartDate)) END) AS Monday ,SUM(CASE WHEN DATEPART(DW, DATEADD(DD,number,@StartDate)) = 3 _ THEN DATEPART(DAY, DATEADD(DD,NUMBER,@StartDate)) END) AS Tuesday ,SUM(CASE WHEN DATEPART(DW, DATEADD(DD,number,@StartDate)) = 4 _ THEN DATEPART(DAY, DATEADD(DD,NUMBER,@StartDate)) END) AS Wednesday ,SUM(CASE WHEN DATEPART(DW, DATEADD(DD,number,@StartDate)) = 5 _ THEN DATEPART(DAY, DATEADD(DD,NUMBER,@StartDate)) END) AS Thursday ,SUM(CASE WHEN DATEPART(DW, DATEADD(DD,number,@StartDate)) = 6 _ THEN DATEPART(DAY, DATEADD(DD,NUMBER,@StartDate)) END) AS Friday ,SUM(CASE WHEN DATEPART(DW, DATEADD(DD,number,@StartDate)) = 7 _ THEN DATEPART(DAY, DATEADD(DD,NUMBER,@StartDate)) END) AS Saturday FROM master.dbo.spt_values v WHERE DATEADD(DD,number,@StartDate) BETWEEN @StartDate _ AND DATEADD(DAY,-1,DATEADD(MONTH,1,@StartDate)) AND v.type = 'P' GROUP BY DATEPART(WEEK, DATEADD(DD,number,@StartDate))