如果对日期函数比较熟悉的话,要实现日历的功能并不难。本文中主要用到的日期函数有:
DATEADD(datepart,number,date) --在日期中添加或减去指定的时间间隔
DATEDIFF(datepart,startdate,enddate)--返回两个日期之间的时间
DATE(date) --返回日期的天数
DATEPART(datepart,date) --返回日期/时间的单独部分
另外,还用到了一个辅助表t100,t100里面的内容是1到100的自然数列。代码很简单,就不多解释。直接上代码!
/*找到月初、月末的日期*/
WITH x0
AS ( SELECT CONVERT(DATE, DATEADD(d, -DAY(GETDATE()) + 1,
GETDATE())) AS 月初 ,
CONVERT(DATE, DATEADD(d, -DAY(GETDATE()),
DATEADD(m, 1, GETDATE()))) AS 月末
),/*生成第几天*/
x1
AS ( SELECT 月初 ,
月末 ,
DATEDIFF(d, 月初, 月末) + 1 AS 第几天
FROM x0
),/*遍历本月的所有日期*/
x2
AS ( SELECT 日期 ,
第几天
FROM ( SELECT DATEADD(d, id - 1, 月初) AS 日期 ,
id AS 第几天
FROM t100
LEFT JOIN x1 ON t100.id <= x1.第几天
) t
WHERE 日期 IS NOT NULL
),/*找到日期对应的所在周,周内某天*/
x3
AS ( SELECT DATEPART(DW, 日期) AS 周几 ,
( DATEPART(WK, 日期) - DATEPART(WK,
DATEADD(D, -DAY(日期), 日期)) )
+ 1 AS 第几周 ,
第几天
FROM x2
)
/*创建本月日历*/
SELECT MAX(CASE 周几
WHEN 1 THEN 第几天
END) 周日 ,
MAX(CASE 周几
WHEN 2 THEN 第几天
END) 周一 ,
MAX(CASE 周几
WHEN 3 THEN 第几天
END) 周二 ,
MAX(CASE 周几
WHEN 4 THEN 第几天
END) 周三 ,
MAX(CASE 周几
WHEN 5 THEN 第几天
END) 周四 ,
MAX(CASE 周几
WHEN 6 THEN 第几天
END) 周五 ,
MAX(CASE 周几
WHEN 7 THEN 第几天
END) 周六
FROM x3
GROUP BY 第几周
ORDER BY 第几周
下图是2015年5月的日历

如果有更好的,更简单的实现方式,欢迎提出,一起交流
