zoukankan      html  css  js  c++  java
  • 生成本月日历

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

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

     

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

     
  • 相关阅读:
    51nod 1463 找朋友 (扫描线+线段树)
    51nod 1295 XOR key (可持久化Trie树)
    51nod 1494 选举拉票 (线段树+扫描线)
    51Nod 1199 Money out of Thin Air (树链剖分+线段树)
    51Nod 1287 加农炮 (线段树)
    51Nod 1175 区间中第K大的数 (可持久化线段树+离散)
    Codeforces Round #426 (Div. 1) B The Bakery (线段树+dp)
    前端基础了解
    git 教程
    HIVE 默认分隔符 以及linux系统中特殊字符的输入和查看方式
  • 原文地址:https://www.cnblogs.com/accumulater/p/6808206.html
Copyright © 2011-2022 走看看