中午正好吃完饭,休息,看到QQ群里面发了一个问题,说给你一个没有年份的日期,算出这个日期所属的星座;起初刚开始的第一个想法就是取星座的开始和起始时间来做区间的比对,得到所在区间,就知道星座了!但后来想想,除了时间区间的比对,有没有其它的方法?
想来想去,试着用数字做比较看看(最后写完才觉得这个本质上和日期做比对没有什么区别);
因为星座的时间区间段是固定的,不会有重复的,那么我可以把时间转换成数字,例如水瓶座是1/20到2/18,那我可以转换成120到218,但随之而来的就有一个问题了,例如今天这个日期,3月4号,由于转换成数字后会变成34(应该是304),中间少了个0,怎么都找不到区间,总是计算不对,最后只能改变一下将时间转换为数字的方法了!
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)));
这个计算星座的方法,最麻烦的就是在前期的日期转换上,时间转好了,其它的就好办了,做数字区间的对比吧,就能得到你想要的星座了!
/* 星座 日期(公历) 英文名 魔羯座 (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:
为了处理摩羯座的那个首尾问题,看来只能这么解决了...哎!