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

我们想要的结果如下:




sql 给Timestamp 赋值 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结束循环。

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


sql 给Timestamp 赋值 sql赋值日期_sql 给Timestamp 赋值_02


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

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

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

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

运行效果如下图所示:


sql 给Timestamp 赋值 sql赋值日期_字段_03


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

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

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 weekdatagroup by FWeekIndex)

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

执行效果如下图所示:


sql 给Timestamp 赋值 sql赋值日期_字段_04


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

最终查询实现效果

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

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

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


sql 给Timestamp 赋值 sql赋值日期_SQL_05


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

希望对您有所帮助!