春节快到了。经常使用数据库的朋友,有没有使用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.文章《sql 如何取一个日期的年份》援引自互联网,为网友投稿收集整理,仅供学习和研究使用,内容仅代表作者本人观点,与本网站无关,侵删请点击页脚联系方式。
2.文章《sql 如何取一个日期的年份》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
相关推荐
- . 现代买票为什么带上携程保险
- . 潮阳怎么去广州南站
- . 湖南马拉河怎么样
- . 烧纸为什么到三岔路口
- . 百色为什么这么热
- . 神州租车怎么样
- . 芜湖方特哪个适合儿童
- . 护肤品保养液是什么类目
- . 早晚的护肤保养有哪些项目
- . 女孩护肤品怎么保养的最好