1. 程式人生 > >生成本月日歷

生成本月日歷

copy 時間 sel join 返回 max edi ges images

如果對日期函數比較熟悉的話,要實現日歷的功能並不難。本文中主要用到的日期函數有:

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

技術分享

如果有更好的,更簡單的實現方式,歡迎提出,一起交流

 

生成本月日歷