你的位置:首页 > 数据库

[数据库]生成本月日历


数据库环境: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月的日历

 

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