各位老铁们,大家好,今天由我来为大家分享数据库达人成长日记:春节将至,如何用SQL制作日历?,以及的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
看起来很简单,但是如何使用纯SQL脚本来实现呢?
今天我们就来剥茧,一步一步地实施这个过程。
使用表变量存储月份每一天的数据
必须首先将每月每一天的数据存储在表中。我们通过表变量存储在这里,定义如下:
declare @year int;declare @monthsmallint;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,我们首先找到当前年份和月份的第一天,然后找到该月的最后一天,根据日期进行循环。脚本如下:
声明@begdatesmalldatetime;声明@enddatesmalldatetime;设置@begdate=cast(@year as varchar(4))+’-‘+cast(@month as varchar(2))+’-1′;set @enddate=dateadd (日,-1,dateadd(月,1,@begdate));而@begdate=@enddate 开始插入@data(FDateStr) 值(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=FDateStrfrom @data) 这里函数datapart用来获取日期的星期,datepart用来获取一周中的某一天。
运行效果如下图所示:
使用分组将日期平铺到星期几
我们添加另一个公共表表达式以按周分组。每个日期根据星期几分组到不同的字段中。脚本如下:
weekname as(select FWeekIndex, max(case when FWeekDay=1 then datename(day,FDay) else ” end) as [day], 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 [six] from weekdatagroup by FWeekIndex) 这里将周字段FWeekIndex 根据FDay 所在星期几进行分组,分为七份属于.场地。
执行效果如下图所示:
我们想要的效果就出来了。
最终查询实现效果
最后我们选择字段列表,屏蔽无用的字段,达到效果。脚本如下:
从周名称中选择[日]、[星期一]、[二]、[三]、[四]、[五]、[六];至此,您就完成了。完整的脚本和效果见下图:
如果我们稍微修改一下并创建一个以@year和@month作为参数的自定义函数,我们就可以随时查看每个月的日历。这里我就不贴代码了,大家可以自己看一下。
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/115129.html
用户评论
聽風
太棒了!这篇文章简直是我新年愿望清单的首选啊。学习SQL已经很久了,一直想尝试制作一个漂亮的日历,现在终于有人分享方法,真是太好了
有6位网友表示赞同!
太易動情也是罪名
春节快到了,准备买个新的日历做装饰品的想法不错。可惜我数据库学得不多,没那么高级的技能,还是乖乖去商店买好了
有10位网友表示赞同!
赋流云
这篇文章写的思路清晰易懂,把SQL语句拆解得很细致,即使是新手也能跟着做。我已经开始尝试了,希望能够顺利完成漂亮的日历!<br><br>
有17位网友表示赞同!
何年何念
新年新气象,制作一个自己设计の日历听起来很吸引人啊!不过我更偏喜欢传统纸质日历的质感,电子日历用不了多久就忘记更新了
有18位网友表示赞同!
■□丶一切都无所谓
数据库大师成长日记? 感觉像是在说我自己!我也一直渴望学习数据库,希望通过你的分享能多了解一些SQL的应用。期待看更多关于数据库的文章!
有10位网友表示赞同!
她最好i
制作日历用SQL真的可以吗?我印象中数据库主要负责存储数据吧? 你这篇文章让我对数据库有了新的认识!
有14位网友表示赞同!
你的眸中有星辰
这篇文章有点过于基础了,对我来说已经太简单了。我更想了解一些更高级的数据库技术,比如多表连接和事务处理
有9位网友表示赞同!
初阳
春节期间做日历这种创意真是好极了!我打算把家人一起参与进来,大家 collaboratively design 一个特别的日历
有5位网友表示赞同!
终究会走-
文章描述了制作日历的步骤很详细,但是缺少一些实际例子。如果能提供几个具体的SQL语句,我觉得会更容易理解
有11位网友表示赞同!
青袂婉约
春节总是让人想回顾过去一年的收获和展望新的一年。制作一个自定义日历确实很有意义!我可能不会用数据库技术,但我一定会尝试其他方法做个个性化日历的
有8位网友表示赞同!
喜欢梅西
新年就是享受自己动手制作的东西的那份乐趣吧!虽然我对数据库不太懂, 但可以想象最终成品会无比独特且有纪念价值。
有20位网友表示赞同!
在哪跌倒こ就在哪躺下
我最近也在学习SQL,刚好看到了你的文章! 太幸运了,能够学到一门实用的技能。制作日历是一个很好的练习项目!
有7位网友表示赞同!
纯情小火鸡
这个方法听起来很酷很高效!但我的数据库水平还是待提升,先把基础知识补起来再说
有10位网友表示赞同!
伤离别
这篇文章太棒了!我觉得很多人都会喜欢用自己的数据和SQL脚本来定制日历的想法。 很有创意啊!
有18位网友表示赞同!
浮世繁华
数据库大师成长日记?期待后续文章分享更多你的数据库学习和实践经验! 祝你新年快乐!
有18位网友表示赞同!
志平
如果能结合一些视觉元素,比如图片或者字体样式修改,制作出来的日历会更加漂亮且吸引人。
有18位网友表示赞同!
哥帅但不是蟋蟀
对于数据库新手来说,这篇文章很有帮助。希望作者能够写一些更具体的学习教程,以便我们更容易入门。
有16位网友表示赞同!
妄灸
我很喜欢这种用技术打造纪念品的理念!明年我也要试试使用SQL制作属于我的专属日历!
有19位网友表示赞同!