首页 > 开发 > 综合 > 正文

生成本月日历

2024-07-21 02:46:59
字体:
来源:转载
供稿:网友
生成本月日历
数据库环境: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月的日历

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表