CREATE FUNCTION PrintCalendar(@Year CHAR(4))
RETURNS
@Calendar TABLE
(
[Month] VARCHAR(20),
WeekNum CHAR(2),
Sun INT,
Mon INT,
Tues INT,
Wed INT,
Thur INT,
Fri INT,
Sat INT
)
AS
BEGIN
DECLARE @FirstDayOfYear DATETIME
SET @FirstDayOfYear = CONVERT(DATETIME, @Year+'-01-01')
INSERT INTO @Calendar([Month],WeekNum, Sun, Mon, Tues, Wed, Thur, Fri, Sat )
SELECT
DATENAME(MONTH,DATEADD(DAY,number,@FirstDayOfYear)),
DATEPART(week,dateadd(DAY,number,@FirstDayOfYear)) week_num,
MAX(CASE WHEN DATEPART(DW,DATEADD(DAY,number,@FirstDayOfYear)) = 1
THEN DATEPART(DAY,DATEADD(DAY,number,@FirstDayOfYear))
END
) AS Sunday,
MAX(CASE WHEN DATEPART(DW,DATEADD(DAY,number,@FirstDayOfYear)) = 2
THEN DATEPART(DAY,DATEADD(DAY,number,@FirstDayOfYear))
END) AS Monday,
MAX(CASE WHEN DATEPART(DW,DATEADD(DAY,number,@FirstDayOfYear)) = 3
THEN DATEPART(DAY,DATEADD(DAY,number,@FirstDayOfYear))
END) AS Tuesday,
MAX(CASE WHEN DATEPART(DW,DATEADD(DAY,number,@FirstDayOfYear)) = 4
THEN DATEPART(DAY,DATEADD(DAY,NUMBer,@FirstDayOfYear))
END) AS Wednesday,
MAX(CASE WHEN DATEPART(DW,DATEADD(DAY,number,@FirstDayOfYear)) = 5
THEN DATEPART(DAY,DATEADD(DAY,number,@FirstDayOfYear))
END) AS Thursday,
MAX(CASE WHEN DATEPART(DW,DATEADD(DAY,number,@FirstDayOfYear)) = 6
THEN DATEPART(DAY,DATEADD(DAY,number,@FirstDayOfYear))
END) AS Friday,
MAX(CASE WHEN DATEPART(DW,DATEADD(DAY,number,@FirstDayOfYear)) = 7
THEN DATEPART(DAY,DATEADD(DAY,number,@FirstDayOfYear))
END) AS Saturday
FROM master..spt_values
WHERE TYPE ='P'
AND DATEPART(YEAR,DATEADD(DAY,number,@FirstDayOfYear)) = @Year
GROUP BY DATENAME(MONTH,DATEADD(DAY, number, @FirstDayOfYear)),
DATEPART(MONTH,DATEADD(DAY, number, @FirstDayOfYear)),
DATEPART(WEEK,DATEADD(DAY, number, @FirstDayOfYear))
ORDER BY DATEPART(MONTH,DATEADD(DAY, number, @FirstDayOfYear)),
DATEPART(WEEK, DATEADD(DAY, number, @FirstDayOfYear))
RETURN
END
GO
--使用
select * from dbo.PrintCalendar(2010)
--@Year 的范围从1753-9999