生成本月日历

王朝学院·作者佚名  2016-05-25
窄屏简体版  字體: 小  |  中  |  大  |  超大  

生成本月日历 数据库环境:SQL SERVER2008R2

如果对日期函数比较熟悉的话,要实现日历的功能并不难。本文中主要用到的日期函数有:

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月的日历

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

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航