您的位置 首页 > 娱乐休闲

数据库大师成长日记:新春佳节将至,如何用SQL制作日历?

春节快要到了,常用数据库的朋友,您会否有一种使用SQL脚本制作一个日历的冲动呢?有就很正常了,但做起来还真不容易,我们今天就发动我们掌握的SQL知识开发一个小日历吧。

我们想要的结果如下:

怎么样,看上去还算简单吧,但用纯SQL脚本如何实现呢?

今天我们就抽丝剥茧,一步步的实现这个过程。

使用表变量存储月份每一天的数据

每个月每一天的数据,首先要存入表中,我们这里通过表变量存储,定义如下:

declare @year int; declare @month smallint; declare @data table( FSerial int identity(1,1) not null, FDateStr varchar(30) ); set @year=2019; set @month=1;

这里定义了三个变量,@year表示年度,@month表示月度,@data表变量计划存放每一天的日期串。同时,将@year赋值2019、将@month赋值1。

考虑到每个月的天数不都是31天,我们先找到当前年月的第一天,在找到月末一天,按照日期来进行循环,脚本如下:

declare @begdate smalldatetime; declare @enddate smalldatetime; set @begdate=cast(@year as varchar(4))+'-'+cast(@month as varchar(2))+'-1'; set @enddate=dateadd(day,-1,dateadd(month,1,@begdate)); while @begdate<=@enddate begin insert into @data(FDateStr) values(CONVERT(varchar(100),@begdate,23)); set @begdate=dateadd(day,1,@begdate); end;

这里定义@begdate存放开始日期、@enddate存放截至日期,通过while循环,日期从@begdate开始,每插入一日后推一天,直到@enddate结束循环。

执行效果是一样的,如下图所示:

获取每个日期是星期几和月的第几周

有了日期数据之后,我们还需要知道两个信息,第一个信息就是日期归属第几周、还有一个就是日期是星期几。这里我们定义一个公用表表达式,脚本如下:

with weekdata as ( select FWeekIndex=datepart(week,FDateStr), FWeekDay=datepart(weekday,FDateStr), FDay=FDateStr from @data )

这里使用函数datapart获取日期归属第几周、使用datepart获取日期是星期几。

运行效果如下图所示:

使用分组将日期平铺到星期几

我们再增加一个公用表表达式,按照第几周进行分组,每个日期按照星期几分组到不同的字段,脚本如下:

weekname as ( select FWeekIndex, max(case when FWeekDay=1 then datename(day,FDay) else '' end) as [日], max(case when FWeekDay=2 then datename(day,FDay) else '' end) as [一], max(case when FWeekDay=3 then datename(day,FDay) else '' end) as [二], max(case when FWeekDay=4 then datename(day,FDay) else '' end) as [三], max(case when FWeekDay=5 then datename(day,FDay) else '' end) as [四], max(case when FWeekDay=6 then datename(day,FDay) else '' end) as [五], max(case when FWeekDay=7 then datename(day,FDay) else '' end) as [六] from weekdata group by FWeekIndex )

这里对第几周字段FWeekIndex进行分组,根据FDay归属的是星期几打散成七个字段。

执行效果如下图所示:

我们要的效果呼之欲出了。

最终查询实现效果

最后来一句select 字段列表,屏蔽掉无用字段,实现效果,脚本如下:

select [日],[一],[二],[三],[四],[五],[六] from weekname;

至此,大功告成,完整的脚本和效果参看下图:

如果我们稍微改造一下,创建一个自定义函数,将@year和@month作为参数,那随时就可以看每个月的日历了。这里我就不贴代码了,您自己捉刀吧。

希望对您有所帮助!

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“数据库大师成长日记新春佳节将至,如何用SQL制作日历,”边界阅读