SQL-计算生日所属的星座
中午正好吃完饭,休息,看到QQ群里面发了一个问题,说给你一个没有年份的日期,算出这个日期所属的星座;起初刚开始的第一个想法就是取星座的开始和起始时间来做区间的比对,得到所在区间,就知道星座了!但后来想想,除了时间区间的比对,有没有其它的方法?
想来想去,试着用数字做比较看看(最后写完才觉得这个本质上和日期做比对没有什么区别);
因为星座的时间区间段是固定的,不会有重复的,那么我可以把时间转换成数字,例如水瓶座是1/20到2/18,那我可以转换成120到218,但随之而来的就有一个问题了,例如今天这个日期,3月4号,由于转换成数字后会变成34(应该是304),中间少了个0,怎么都找不到区间,总是计算不对,最后只能改变一下将时间转换为数字的方法了!
1 | SELECT @NowDate = ( CAST ( MONTH (@Birthday) AS VARCHAR (10)) + CAST (( CASE WHEN DAY (@Birthday) < 10 THEN '0' + CAST ( DAY (@Birthday) AS VARCHAR (10)) ELSE CAST ( DAY (@Birthday) AS VARCHAR (10)) END ) AS VARCHAR (10))); |
这个计算星座的方法,最麻烦的就是在前期的日期转换上,时间转好了,其它的就好办了,做数字区间的对比吧,就能得到你想要的星座了!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | /* 星座 日期(公历) 英文名 魔羯座 (12/22 - 1/19) Capricorn 水瓶座 (1/20 - 2/18) Aquarius 双鱼座 (2/19 - 3/20) Pisces 牡羊座 (3/21 - 4/20) Aries 金牛座 (4/21 - 5/20) Taurus 双子座 (5/21 - 6/21) Gemini 巨蟹座 (6/22 - 7/22) Cancer 狮子座 (7/23 - 8/22) Leo 处女座 (8/23 - 9/22) Virgo 天秤座 (9/23 - 10/22) Libra 天蝎座 (10/23 - 11/21) Scorpio 射手座 (11/22 - 12/21) Sagittarius */ DECLARE @ TABLE TABLE ( name_zh VARCHAR (128), name_en VARCHAR (128), s_time INT , o_time INT ); DECLARE @NowDate INT ; DECLARE @Birthday DATETIME; SET @Birthday = GETDATE() SELECT @NowDate = ( CAST ( MONTH (@Birthday) AS VARCHAR (10)) + CAST (( CASE WHEN DAY (@Birthday) < 10 THEN '0' + CAST ( DAY (@Birthday) AS VARCHAR (10)) ELSE CAST ( DAY (@Birthday) AS VARCHAR (10)) END ) AS VARCHAR (10))); INSERT INTO @ TABLE VALUES ( '魔羯座' , 'Capricorn' ,1222 ,119), ( '水瓶座' , 'Aquarius' ,120 ,218), ( '双鱼座' , 'Pisces' ,219 ,320), ( '牡羊座' , 'Aries' ,321 ,420), ( '金牛座' , 'Taurus' ,421 ,520), ( '双子座' , 'Gemini' ,521 ,621), ( '巨蟹座' , 'Cancer' ,622 ,722), ( '狮子座' , 'Leo' ,723 ,822), ( '处女座' , 'Virgo' ,823 ,922), ( '天秤座' , 'Libra' ,923 ,1022), ( '天蝎座' , 'Scorpio' ,1023 ,1121), ( '射手座' , 'Sagittarius' ,1122 ,1221); IF @NowDate > 1222 BEGIN SELECT '魔羯座' name_zh, 'Capricorn' name_en, '1222' s_time, '119' o_time END ELSE BEGIN SELECT name_zh, name_en, s_time, o_time FROM @ TABLE WHERE @NowDate BETWEEN s_time AND o_time; END |
这个方法没有过细的去验证,可能会存在Bug或者性能上的损失,以后有时间会在进一步改写!
eg:
为了处理摩羯座的那个首尾问题,看来只能这么解决了...哎!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
· 程序员转型AI:行业分析