SQL打印全年日历

简介: 原文:SQL打印全年日历数据库环境:SQL SERVER 2008R2 我之前有写过打印本月日历的SQL,里头有详细的说明。具体请参考前面的博文——生成本月日历。 全年日历只是在本月日历的基础上加了月信息,并按月份分组求得。
原文: SQL打印全年日历

数据库环境:SQL SERVER 2008R2

我之前有写过打印本月日历的SQL,里头有详细的说明。具体请参考前面的博文——生成本月日历

全年日历只是在本月日历的基础上加了月信息,并按月份分组求得。

下面直接分享SQL

/*基础数据:年初日期,全年有多少天*/
WITH    x0
          AS ( SELECT   CONVERT(DATE, '2015-01-01') AS yearbegin ,
                        CONVERT(DATE, '2015-12-31') AS yearend ,
                        DATEDIFF(DAY, '2015-01-01', '2015-12-31') AS dayscount
             ),/*枚举全年的所有日期*/
        x1
          AS ( SELECT   DATEADD(DAY, number, yearbegin) AS ndate
               FROM     x0 ,
                        master.dbo.spt_values spt
               WHERE    spt.type = 'P'
                        AND spt.number >= 0
                        AND spt.number <= dayscount
             ),/*罗列全年日期对应的月份,第几周,星期几,本月第几天*/
        x2
          AS ( SELECT   ndate ,
                        DATEPART(month, ndate) AS nmonth ,
                        DATEPART(week, ndate) AS nweek ,
                        DATEPART(weekday, ndate) AS nweekday ,
                        DATEPART(day, ndate) AS nday
               FROM     x1
             ),/*按月份、所在周分组,生成全年日历*/
        x3
          AS ( SELECT   nmonth ,
                        nweek ,
                        ISNULL(CAST(MAX(CASE nweekday
                                          WHEN 1 THEN nday
                                        END) AS VARCHAR(2)), '') AS 日 ,
                        ISNULL(CAST(MAX(CASE nweekday
                                          WHEN 2 THEN nday
                                        END) AS VARCHAR(2)), '') AS 一 ,
                        ISNULL(CAST(MAX(CASE nweekday
                                          WHEN 3 THEN nday
                                        END) AS VARCHAR(2)), '') AS 二 ,
                        ISNULL(CAST(MAX(CASE nweekday
                                          WHEN 4 THEN nday
                                        END) AS VARCHAR(2)), '') AS 三 ,
                        ISNULL(CAST(MAX(CASE nweekday
                                          WHEN 5 THEN nday
                                        END) AS VARCHAR(2)), '') AS 四 ,
                        ISNULL(CAST(MAX(CASE nweekday
                                          WHEN 6 THEN nday
                                        END) AS VARCHAR(2)), '') AS 五 ,
                        ISNULL(CAST(MAX(CASE nweekday
                                          WHEN 7 THEN nday
                                        END) AS VARCHAR(2)), '') ASFROM     x2
               GROUP BY nmonth ,
                        nweek
             )/*将月份相同的值只在第一行显示*/
    SELECT  REPLACE(CASE WHEN ROW_NUMBER() OVER ( PARTITION BY nmonth ORDER BY nweek ) = 1
                         THEN nmonth
                         ELSE -1
                    END, -1, '') AS 月份 ,
            日 ,
            一 ,
            二 ,
            三 ,
            四 ,
            五 ,
            六
    FROM    x3

代码不算多,60多行,而且也好理解。如果觉得把“周日”放在第一列有点别扭,可以x2中生成所在周时对周日

做一些特别处理就可以了。

贴一下结果

             

 

(本文完)

目录
相关文章
|
SQL Java 数据库连接
Springboot JPA日志输出打印SQL语句和传入的参数 高阶篇
Springboot JPA日志输出打印SQL语句和传入的参数 高阶篇
4555 0
Springboot JPA日志输出打印SQL语句和传入的参数 高阶篇
【SQL开发实战技巧】系列(十九):数据仓库中时间类型操作(进阶)如何一个SQL打印当月或一年的日历?如何确定某月内第一个和最后—个周内某天的日期?
如何一个SQL打印出当月日历或当年日历???如何统计一年内属于周内某一天的所有日期???如何确定某月内第一个和最后—个周内某天的日期???【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。本例要求返回当月内第一个星期一与最后一个星期一,我们分别找上月末及当月末之前七天的下一周周一即可。
【SQL开发实战技巧】系列(十九):数据仓库中时间类型操作(进阶)如何一个SQL打印当月或一年的日历?如何确定某月内第一个和最后—个周内某天的日期?
|
SQL XML Java
【Log日志】打印mybatis中sql日志并存放到指定文件中
【Log日志】打印mybatis中sql日志并存放到指定文件中
1419 0
【Log日志】打印mybatis中sql日志并存放到指定文件中
|
SQL XML Java
第15篇:Mybatis中打印Sql信息
在Mybatis中如果我们要对我们的sql信息进行检查, 只能启动Spring容器, 去执行根据成功和失败来判断我们的逻辑是否有问题。 此时会比较耗时,因为要启动容器。基于这个痛点, 本文要设计一个工具。使我们不依赖Spring容器,也不依赖任何外部插件,直接就把 Sql信息的打印出来。
725 0
|
SQL Java 程序员
MyBatis-Plus - 高级功能——SQL性能分析打印插件
MyBatis-Plus - 高级功能——SQL性能分析打印插件
1560 0
MyBatis-Plus - 高级功能——SQL性能分析打印插件
|
SQL
在tp5.1 fetchSql打印出执行的sql语句
在tp5.1 fetchSql打印出执行的sql语句
530 0
在tp5.1 fetchSql打印出执行的sql语句
|
SQL Java API
9、springcloud整合logback打印sql语句
logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。 Logback是要与SLF4J结合起来用的。
1226 0
9、springcloud整合logback打印sql语句
|
SQL Java 数据库连接
【Log日志】打印mybatis中sql日志并存放到指定文件中
【Log日志】打印mybatis中sql日志并存放到指定文件中
1737 0
|
SQL
MybatisPlus开启打印sql语句
MybatisPlus开启打印sql语句
1688 0
|
SQL 数据库 Python
Django打印ORM执行sql语句日志
Django打印ORM执行sql语句日志
850 0