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)), '') AS 六
FROM 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打印全年日历的更多相关文章
- 用SQL打印乘法口诀表
--用SQL打印出乘法口诀表 declare @i int ,@j int --@i是乘法口诀的行数 --一共九行 begin --每次都是从1*开始,j每循环一次递增 )--print每次输出都会换 ...
- bootstrap-year-calendar全年日历插件
使用方法使用bootstrap-year-calendar插件需要引入jQuery.Bootstap3的相关依赖文件和插件本身需要的js和css文件. <link rel="style ...
- MybatisPlus SQL 打印控制台
#applicaton.yml 配置 mybatis-plus: configuration: # 是否将sql打印到控制面板(该配置会将sql语句和查询的结果都打印到控制台) log-impl: o ...
- Liferay中SQL打印参数
XX\tomcat-7.0.42\webapps\ROOT\WEB-INF\classes\log4j.properties log4j.rootLogger=INFO, CONSOLE log4 ...
- spring boot mybatis sql打印到控制台
如何设置spring boot集成 mybatis 然后sql语句打印到控制台,方便调试: 设置方法: 在application.properties文件中添加: logging.level.com. ...
- springboot整合mybatis将sql打印到日志(转)
在前台请求数据的时候,sql语句一直都是打印到控制台的,有一个想法就是想让它打印到日志里,该如何做呢? 见下面的mybatis配置文件: <?xml version="1.0" ...
- springboot整合mybatis将sql打印到日志
在前台请求数据的时候,sql语句一直都是打印到控制台的,有一个想法就是想让它打印到日志里,该如何做呢? 见下面的mybatis配置文件: <?xml version="1.0" ...
- springboot+mybatis 配置sql打印日志
第一种: 配置类型 # 配置slq打印日志 logging.level.com.lawt.repository.mapper=debug重点: #其中 com.lawt.repository.ma ...
- 【NHibernate】配置- sql打印
<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property> <pr ...
随机推荐
- android学习——必学基础组件
android基础组件是一个Android的开发人员必须要了解,且深刻理解的东西: 1.应用程序基础 2.应用程序组件 2.1.活动(Activities) 2.2.服务(Services) 2.3. ...
- Linux文件虚拟机系统只读Read-only file system的快速解决方法
问题描述:上周公司的私有云(底层架构是Openstack+KVM,目前稳定性还不够好,开发团队在改进中)一个计算节点挂掉,之后恢复后发现这个计算节点的所有Linux系统都变成只读了,复制文件提示:Re ...
- scp 在不同机器上传文件
推荐个博客,挺好的.http://www.cnblogs.com/hyddd/archive/2009/09/19/1570224.html 在不同机器上传文件是一个很常见的需求,也有很多种方法.我只 ...
- ARM学习笔记15——串口通信基本原理【转】
计算机串口基本理论 1.什么是串口? 2,什么是RS-232? 3,什么是RS-422? 4,什么是RS-485? 5,什么是握手? 1,什么是串口? 串口是计算机上一种非常通用的设备通信的协议(不要 ...
- PHP中 magic_quotes_gpc 和 magic_quotes_runtime 区别及其反斜线转义问题
php中关于反斜线转义: php中数据的魔法引用函数 magic_quotes_gpc 或 magic_quotes_runtime 设置为on时,当数据遇到 单引号' 和 双引号" ...
- bzoj 2243 [SDOI2011]染色(树链剖分,线段树)
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4637 Solved: 1726[Submit][Status ...
- 5 weekend01、02、03、04、05、06、07的分布式集群的HA测试 + hdfs--动态增加节点和副本数量管理 + HA的java api访问要点
weekend01.02.03.04.05.06.07的分布式集群的HA测试 1) weekend01.02的hdfs的HA测试 2) weekend03.04的yarn的HA测试 1) wee ...
- Java的垃圾回收概述
Java语言建立了垃圾收集机制,即GC,用以跟踪正在使用的对象和发现并回收不再使用的对象,垃圾清理势在必行,以下讲述java垃圾收集算法. 1.Java垃圾收集算法的核心思想 Java语言建立了垃圾收 ...
- Using OpenCV with gcc and CMake
Using OpenCV with gcc and CMake Note We assume that you have successfully installed OpenCV in your w ...
- 解决DATASNAP远程方法参数超过32个的问题
群里有位同仁提出他有一个DATASNAP远程方法超过了32个参数,然后DELPHI编译通不过,提示方法参数不能超过32个,问怎么办?于是群内同仁纷纷出主意,我说用OLEVARINAT数组,有人说用RE ...