sql 如何取一个日期的年份

2023-02-27 07:53 32次浏览 攻略

春节快到了。经常使用数据库的朋友,有没有使用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作为参数,那随时就可以看每个月的日历了。这里我就不贴代码了,您自己捉刀吧。

希望对您有所帮助!

相关推荐