EXCEL中從身份證號碼提取出生日期的方法
由於工作需要,我需要單位人員的出生年月,單獨一個一個輸入?NO~太麻煩了。我的工資程序里有人員信息,而且有每個人的身份證號碼,所以我就想出了利用excel來完成這個工作。
PS,我是用office2003的excel完成這個操作的,office2000可能有些操作有些不同,不妨試一下。
首先先要說幾個公式,明白了這幾個公式後,就能簡單完成了。
①函數【left】 作用:提取數據左邊n個數字的內容 默認公式:=left(text, [num_chars]) 翻譯公式:=left(數據,n[數字]) 舉例:=left("Hello",2) 輸出結果為最開始的2個字母「He」
②函數【right】 作用:提取數據右邊n個數字的內容 默認公式:=right(text, [num_chars]) 翻譯公式:=right(數據,n[數字]) 舉例:=right("Hello",2) 輸出結果為最末尾的2個字母「lo」
好了,利用這兩個公式,就可以做到簡單的提取一個身份證號碼中的日期了。
舉例,某人身份證為310123190102039527(18位),輸入到"A1"單元格,建議用把單元格改成"文本",不然會顯示為科學計數法。
【單元格改成文本的方法:滑鼠右擊"A1"單元格,選擇「設置單元格格式(F)...」,在「單元格格式」對話框中,選擇「數字」標籤,「分類(C)」里選擇「文本」,點「確定」】
那用公式套用的話,先用left吧,最後4位是不要的,所以提取左邊14位。這個身份證號碼已經輸入到"A1"單元格,那麼在"B1"單元格可以這樣輸入:=left(A1,14),那出現的結果就是「31012319010203」,然後你可以用right命令提取"B2"單元格里後8位數字,就可以提取出生日代碼了。比如我們在"C1"單元格里輸入=right(B1,8),出現的結果就是「19010203」,基本工程完成了。
接下來是進階教程,其實,完全可以把2個命令合併使用,比如,我們在"D1"單元格里這樣輸入:=right(left(A1,14),8),看看結果如何?是不是直接出現了正確結果?
其實,如果left和right兩個命令同時用到,可以用一個更好的命令【mid】來代替,接下來我來說一下mid的用法:
③函數【mid】 作用:提取數據,從左邊起第n個數字開始,長度為m的內容 默認公式:=mid(text, start_num, num_chars) 翻譯公式:=mid(數據,n[開始第n位],m[長度]) 舉例:=mid("Hello",2,3) 輸出結果為從第二位開始,長度為3的字母「ell」 那樣,剛剛複雜的left和right嵌套,可以在"E1"單元格輸入公式=mid(A1,7,8)試試,就算出了正確的結果「19010203」
但是,又出現問題了,這樣的日期,一個8位的數字,其實不是excel正式的日期格式,正式的日期格式應該為「1901-02-03」,那如何操作呢?
我的思路是這樣的,分別提取出「年」、「月」、「日」,然後利用公式把年月日連接起來,就成為了正式的日期格式,接下來要引入第四個公式【date】
④函數【date】 作用:提取「年」、「月」、「日」,使其轉化成日期格式 默認公式:=date(year, month, day) 翻譯公式:=date(x[年],y[月],z[日]) 舉例:=date(1901,02,03) 輸出結果為日期格式的「1901-2-3」
接下來,按照如下操作提取出年月日:
提取年,在"F1"單元格輸入:=mid(A1,7,4),輸出結果為「1901」。
提取月,在"G1"單元格輸入:=mid(A1,11,2),輸出結果為「02」。
提取日,在"H1"單元格輸入:=mid(A1,13,2),輸出結果為「03」。
最後合併,在"H1"單元格輸入:=date(F1,G1,H1),看看輸出結果如何?其實,這裡也可以用date和mid的嵌套公式,=date(mid(A1,7,4),mid(A1,11,2),mid(A1,13,2))直接提取出日期。
不過又出現一個問題,如果有些人的身份證號碼是15位的呢?那麼如何處理呢?其實一樣的,15位身份證號碼生日只有從第7位開始,6個數字,如果一口氣寫成嵌套公式,就是=date(mid(單元格,7,2),mid(單元格,9,2),mid(單元格,11,2),比如我再舉例一個身份證號碼:310123010203952,把這個字元串輸入"A2"單元格(記得先把A2單元格轉換成文本格式),然後在B2單元格輸入=date(mid(A2,7,2),mid(A2,9,2),mid(A2,11,2))。其實,date裡面的數據是date(01,02,03),公式會自動轉換成1901-2-3,其實這裡涉及到一個千年蟲問題,其實現在已經是2010年,如果你把2001年2月3日簡寫成01年2月3日,由date命令就會轉化成1901-2-3,以後在輸入中一定要注意。不過有點可以放心,老的15位身份證不可能出現在2000年以後,也就是它2位數的年份正好直接轉換成19XX,也不用多考慮,直接套用date公式。如果為了再嚴謹一些,確保日期為19XX年份的,可以在把公式改成=date("19"&mid(A2,7,2),mid(A2,9,2),mid(A2,11,2),這樣就強制是19XX年了。其實這裡大可不必這樣做。
現在問題又來了,如果我電腦里的數據,既有18位的,又有15位的,有什麼辦法只用一個公式搞定它?答案是有的。這裡又要引入一個判別函數【if】
⑤函數【if】 作用:判別,如果成立,輸出公式/結果1;如果不成立,輸出公式/結果2 默認公式:=if(logical_test, [value_if_ture], [value_if_false]) 翻譯公式:=if(判別式, 公式/結果1[判別式為真], 公式/結果2[判別式結果為假]) 舉例1:=if(1+2=3,"答案正確","答案錯誤") 輸出結果「答案正確」【1+2=3,結果為真,所以輸出結果1】 舉例2:=if(false,"正確嗎?","錯誤嗎?") 輸出結果「錯誤嗎?」【false直接判別為假,所以輸出結果2】 舉例3:=if(0,"1是正確","0是錯誤") 輸出結果「0是錯誤」【0直接判別為假(其他數字例如1、2、3的結果都為真),所以輸出結果2】
說個題外話if語句比較經典,我多舉了幾個例子,我經常用它來核對,比如有2列數字或者姓名,我要確保它們的位置一一對應,我就可以用if來判斷,比如這兩列分別是A列和B列,我在C1單元格輸入=if(A1=B1,"","X")然後選中C1單元格,滑鼠按住這個單元格邊框右下角的小黑方塊往下拉(或者雙擊)可以直接判斷出A列和B列的數據是否一樣。
這裡if怎麼用呢?對了,就是先在判別式里判斷出身份證的長度,對了,還要說判斷長度的公式【len】
⑥函數【len】 作用:輸出結果為字元長度 默認公式:=len(text) 翻譯公式:=len(數據) 舉例:=len("Hello") 輸出結果為「5」
那開始用if語句來完成這個工作,比如我新建了一個表格,隨便輸入了如下4個身份證號碼
可以用LEN(A2)=18作為if語句的判別式,如果為真,輸出結果1,即18位身份證的提取公式date(mid(A2,7,4),mid(A2,11,2),mid(A2,13,2)),那在結果2中輸入15位的身份證判別式date(mid(A2,7,2),mid(A2,9,2),mid(A2,11,2))。寫在"B2"單元格中,顯示出的結果為「9748」。這是為什麼勒?因為B2單元格的「單元格格式」不對,滑鼠右擊"B2"單元格,選擇「數字」標籤,「分類 (C)」中的「日期」,確定即可,結果就對了。【當然,如果你喜歡,你可以選擇比如「XXXX年XX月XX日」的格式,也可以只顯示年月等】
接下來就按住"B2"單元格右下角的小黑方塊往下拉(雙擊小方塊效果更好),結果就都出來了。
這裡再展開一下,為什麼一開始"B2"單元格輸出結果為9748呢?怎麼說呢?我只能用一種自己理解的非官方回答來說明,其實你們看到單元格的日期是個假象,其實真正背後的內容是一個數字。不妨可以做個實驗,你隨便找個單元格,輸入數字「1」,然後修改「單元格格式」,改成「日期」格式,看到結果是什麼?「1900-1-1」,就是說數字「1」對應的日期是「1900-1-1」。然後,再輸入一個日期「9999-12-31」,這個日期是現有電腦能判斷出最「將來」的日期,然後修改「單元格格式」,改成「常規」,結果就是「2958465」,這就是日期格式的最大值和最小值。
而且經過我的測試,存在小數點的數字也是可以轉換成日期的,小數點後的內容就是時間。例如「123.456」,轉化成日期格式【註:這裡的日期格式要帶時間的】後輸出結果為「1900-5-2 10:56:38 AM」,所以說,日期是可以計算的,例如:"A1"單元格輸入你的出生日期,"A2"單元格輸入今天的日期,然後在"A3"單元格輸入:=A2-A1,然後看到的結果為日期格式,別著急,把"A3"單元格的格式改成「常規」,對了,這就是你出生以來活了多少天。當然,你可以在"A4"單元格輸入:=A3/365,就可以算出自己幾歲了(實足年齡)。
另外,如果你輸入「0」,然後轉化成日期格式,是不成立的,「1900-1-0」這個數字自動左對齊,也就是說這個數據已經成為了文本格式,默認日期格式是右對齊的。當然,你輸入類似「1856-5-9」之類的1900之前的日期格式,是死活不會轉變成日期格式的,只會默認成為文本格式,自動左對齊。如果輸入「-1」再轉換成日期格式就更離譜了,輸出結果直接是「##########」。當然,超過最大值的「2958465」後一個數字「2958466」轉化成日期格式,也是輸出「##########」,不存在。
所以說,以前1999年面臨最大的問題是「千年蟲」問題,可能到了2000年,日期顯示為1900年。不過現在都已經解決了這個問題。但是,在比較遠的未來,將會遇到「萬年蟲」問題,當然,這離我們很遙遠,那時候地球在不在還是個問題,不過我感覺,這個「萬年蟲」問題可能比之前的「千年蟲」問題更嚴重,也許,那時候我們的身份證號碼要成為了19位也說不定。
推薦閱讀:
※清風玄學:從出生生日日期看出一生的財運
※從八字出生日期看什麼人是天生愛操心!值得一看
※Excel 日期相減 DATEDIF 函數用法實例
※玄真閣:出生日期尾數是幾,天生長壽命,一生富貴多金
※還在為挑選結婚日期而發愁嗎?