生成本月日歷
阿新 • • 發佈:2017-05-04
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月的日歷
如果有更好的,更簡單的實現方式,歡迎提出,一起交流
生成本月日歷