中午正好吃完飯,休息,看到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 @TABLEVALUES('魔羯座' ,'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 > 1222BEGINSELECT '魔羯座' name_zh,'Capricorn' name_en,'1222' s_time,'119' o_timeENDELSEBEGINSELECT name_zh,name_en,s_time,o_timeFROM @TABLE WHERE @NowDate BETWEEN s_time AND o_time;END
這個方法沒有過細的去驗證,可能會存在Bug或者效能上的損失,以後有時間會在進一步改寫!
eg:
為了處理摩羯座的那個首尾問題,看來只能這麼解決了...哎!