如何根据对象获取到对应的表名_数据库大师成长日记:如何使用SQL根据生日获取星座?...

喜欢星座的朋友,肯定很关心某个人的生日对应的什么星座。经常玩数据库的朋友们,肯定会想着能不能用SQL语句实现这个过程,我们今天不妨尝试一番,看看能否找到合适的实现方法。

星座和日期的对应关系

星座共有十二个,每个星座对应的名称和区间如下图所示:

931afb444eaeba091c49b4755a76eda5.png

由上图可知,每个星座的不考虑年份的日期区间是固定的,要知道生日对应的星座,只需要知道生日的年月落在那个区间即可。

我们需要判断的数据,主要是日期区间,最容易理解的方式,就是我们把开始的月份和天、以及结束的月份和天拆分成四个数据进行比对。这种方式太复杂了,关键是使用逻辑判断太过复杂。

我们转换思路,换一种方式,把开始日期和结束日期当成浮点数,月份是整数部分、天是小数部分,这样我们需要判断的数据就变成了两个,而且更容易使用逻辑判断对比。比如“双子座”,日期区间可转换成6.22和7.22,如果我们把生日的月份和天也转换成浮点数,就可以直接使用逻辑判断了。

33e25e5c12041f358dd34207100e438d.png

对于12个星座的数据,我们也有两种方式处理,一种方式是创建一个表变量将12条数据预先存储起来,另一种方式则直接在select中使用case语句判断。

下面我们就两种方式分别实现。

使用表变量预存星座数据实现

使用表变量先把星座数据预存起来,再将生日数据解析成对应格式,这里解析生日用到了format函数,语法如下:

format(@birthday,'MM.dd')

这样可以直接把生日的月份和天直接转换成浮点数字符串,在使用cast强制转换为浮点数。

完整脚本参考如下:

declare @data table( FSerial int identity(1,1) not null, FCNName nvarchar(30), FENName varchar(30), FBeg decimal(28,10), FEnd decimal(28,10));insert into @data(FCNName,FENName,FBeg,FEnd)values('白羊座','Aries',3.21,4.20),('金牛座','Taurus',4.21,5.20),('双子座','Gemini',5.21,6.21),('巨蟹座','Cancer',6.22,7.22),('狮子座','Leo',7.23,8.22),('处女座','Virgo',8.23,9.22),('天秤座','Libra',9.23,10.22),('天蝎座','Scorpio',10.23,11.21),('射手座','Sagittarius',11.22,12.21),('魔羯座','Capricorn',12.22,1.19),--特殊('水瓶座','Aquarius',1.20,2.18),('双鱼座','Pisces',2.19,3.20)declare @birthday smalldatetime;set @birthday='1988-8-8';declare @val decimal(28,10);set @val=cast(format(@birthday,'MM.dd') as decimal(28,10))select FCNNAME,FENNAMEfrom @datawhere (@val>=FBeg and @val<=FEnd) or (@val>=12.22 and @val<=12.31) or (@val>1.01 and @val<=1.19)

运行结果参考下图:

a3fadf93987afcb03a8196e2d516c9d4.png

使用case方式实现

使用Case ... When的方式实现就更加直接,根据生日解析出的浮点数,判断所落在的区间。这种方式没什么难度,我这里就不再赘述了。

希望对您有所帮助!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值