ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Excel提取身份证出生日期:MID、DATE与快速填充三种方法详解

Excel提取身份证出生日期:MID、DATE与快速填充三种方法详解 身份证号里藏着出生日期这事儿几乎每个做人事、做教务、做客户台账的人都绕不开。我最早接触这个需求是在帮一个做培训报名的朋友整理学员表几千条数据身份证号一列出生日期一列空着要求填成 1990/05/12 这种标准格式。当时我第一反应是用分列结果发现身份证号是 18 位纯数字Excel 默认按科学计数法处理分出来全是乱的。后来折腾了 MID、TEXT、DATE 三个函数的组合才算把这事儿彻底解决。这篇就把我这些年用过的三种提取方法完整拆一遍从最简单的函数拼接到能自动兼容 15 位和 18 位的老身份证再到批量处理时的格式陷阱都会讲到。不管你是刚接触 Excel 函数的新手还是天天跟数据打交道的老人应该都能从里面找到能直接抄作业的方案。1. 先搞清楚身份证号里到底藏了什么在动手写公式之前得先把身份证号的编码规则弄明白不然公式写出来也是知其然不知其所以然。18 位身份证号的第 7 到第 14 位就是出生日期格式是 YYYYMMDD比如 19900512 就代表 1990 年 5 月 12 日。这个位置是固定的不会因为地区或者性别而变化所以提取逻辑非常稳定。1.1 18 位身份证的位数分布把 18 位拆开看结构是这样的前 6 位是地址码代表出生地中间 8 位是出生日期码接着 3 位是顺序码其中最后一位奇数分配给男性、偶数分配给女性最后 1 位是校验码可能是 0-9 或者字母 X。我们要的出生日期就是第 7 位到第 14 位这 8 个数字。用 MID 函数的话起始位置是 7长度是 8这个参数记牢了后面所有方法都围绕它展开。1.2 15 位老身份证的特殊处理15 位身份证是早期版本现在虽然少见但在一些老档案、老系统导出的数据里还是能碰到。它的出生日期在第 7 到第 12 位只有 6 位格式是 YYMMDD比如 900512 代表 1990 年 5 月 12 日。这里有个坑年份只有两位需要判断是 19xx 还是 20xx。常见的做法是给年份前面补 19因为 15 位身份证基本是 2000 年以前发放的。如果你的数据里确实存在 2000 年后仍用 15 位的情况极少那就得另做判断但绝大多数场景补 19 就够了。1.3 为什么不能直接用分列很多人第一反应是用数据选项卡里的分列功能按固定宽度把出生日期切出来。这个方法在身份证号是文本格式时能用但问题在于Excel 对超过 15 位的纯数字会强制转成科学计数法18 位身份证号一旦被识别成数字后三位直接变成 0数据就废了。所以分列之前必须确保身份证号列是文本格式或者先加个单引号。即便这样分列出来的结果还是 19900512 这种 8 位数字不是标准日期还得再转一次。相比之下函数方法一步到位还能批量下拉效率高得多。2. 方法一MID TEXT 组合最直观的拼接思路这是我最开始用的方法逻辑最简单适合刚上手的新手。核心思路就是用 MID 把 8 位日期字符串抠出来再用 TEXT 函数把它格式化成带斜杠或者横杠的标准日期样式。2.1 MID 函数的基本用法MID 函数的语法是MID(text, start_num, num_chars)三个参数分别是要处理的文本、从第几位开始、取几位。对应到身份证提取假设身份证号在 A2 单元格公式就是MID(A2, 7, 8)这个公式跑出来的结果是 19900512 这样的 8 位字符串。注意如果 A2 是数值格式的身份证号MID 会先把它转成文本再处理但超过 15 位后精度已经丢了所以务必保证身份证号列是文本格式。判断方法很简单看单元格左上角有没有绿色小三角有的话就是文本没有的话选中列设置单元格格式为文本再重新输入。2.2 TEXT 函数把 8 位数字变成日期样式光有 19900512 还不够得让它显示成 1990/05/12 或者 1990-05-12。TEXT 函数就是干这个的语法是TEXT(value, format_text)。把 MID 的结果套进去TEXT(MID(A2, 7, 8), 0000-00-00)这里 0000-00-00 是格式代码0 代表占位符会把 19900512 解析成 1990-05-12。如果你想要斜杠样式改成 0000/00/00 就行。实测下来这个公式在大多数场景都能跑通但它有个致命问题结果是文本不是真正的日期值。这意味着你没法用它做日期计算比如算年龄、算工龄、按日期排序都会出问题。2.3 文本日期的局限性我踩过这个坑。当时用 TEXT 提取完看着挺漂亮结果要做年龄统计的时候发现 DATEDIF 函数报错因为 DATEDIF 要求参数是真正的日期序列值不是文本。后来查了半天才明白TEXT 返回的永远是文本哪怕它长得像日期。解决办法有两个一是后面再套一层 DATEVALUE 把文本转成日期序列值二是直接用下面要讲的 DATE 函数方法。如果你只是要显示不参与计算TEXT 方法够用但凡涉及任何日期运算建议直接跳到方法二。3. 方法二DATE MID 组合生成真正的日期值这个方法是我现在的主力方案因为它返回的是货真价实的日期序列值能直接参与所有日期计算。核心思路是把 MID 抠出来的年月日分别提取再喂给 DATE 函数组装成标准日期。3.1 用 MID 分别提取年、月、日还是假设身份证号在 A218 位格式。年份是第 7 位开始的 4 位月份是第 11 位开始的 2 位日期是第 13 位开始的 2 位。三个提取公式分别是MID(A2, 7, 4) 年份 MID(A2, 11, 2) 月份 MID(A2, 13, 2) 日期这三个公式跑出来分别是 1990、05、12。注意月份和日期是两位字符串DATE 函数能自动识别不用额外转换。3.2 DATE 函数组装标准日期DATE 函数的语法是DATE(year, month, day)把上面三个 MID 套进去DATE(MID(A2, 7, 4), MID(A2, 11, 2), MID(A2, 13, 2))这个公式返回的就是 1990/5/12 这个日期序列值。你可以直接对它设置单元格格式显示成 1990-05-12、1990年5月12日或者任何你想要的样式因为它本质是日期格式只是外衣。我一般会把它设成 yyyy-mm-dd跟数据库的日期格式对齐导出的时候不会出乱子。3.3 处理 15 位身份证的兼容写法如果数据里混着 15 位和 18 位就得加个判断。思路是用 LEN 函数测长度18 位走一套逻辑15 位走另一套。15 位的年份是第 7 位开始的 2 位需要补 19月份第 9 位开始 2 位日期第 11 位开始 2 位。完整公式IF(LEN(A2)18, DATE(MID(A2,7,4), MID(A2,11,2), MID(A2,13,2)), DATE(19MID(A2,7,2), MID(A2,9,2), MID(A2,11,2)))这个公式看起来长但逻辑很清晰先判断长度18 位直接组装15 位给年份补 19 再组装。实测下来兼容性很好几千条数据里混着两种格式也能一次跑完。唯一要注意的是如果 15 位身份证的年份实际是 2000 年后的极罕见这个公式会算错那种情况就得手动处理了。3.4 为什么 DATE 方法比 TEXT 方法更值得用除了能参与计算这个核心优势DATE 方法还有几个隐性好处。第一它返回的是数值排序的时候按日期大小排不会出现文本排序那种 1990/12/01 排在 1990/2/01 前面的乱象。第二导出到其他系统时日期序列值能被正确识别文本日期经常被当成字符串处理。第三做数据透视表的时候DATE 结果能自动按年、季度、月分组TEXT 结果只能当普通文本。所以除非你只是要个显示效果否则一律推荐 DATE 方法。4. 方法三TEXTSPLIT 或快速填充适合新版 Excel 的懒人方案如果你用的是 Microsoft 365 或者 Excel 2021 之后的版本有两个更省事的路子。一个是 TEXTSPLIT 函数一个是快速填充Flash Fill。这两个方法适合数据量不大、或者不想记公式的场景。4.1 TEXTSPLIT 拆分再重组TEXTSPLIT 是 365 版本才有的函数能把一个字符串按指定分隔符拆成数组。身份证号没有分隔符但我们可以先用 MID 把日期段抠出来再用 TEXTSPLIT 按位置拆。不过说实话这个场景下 TEXTSPLIT 并不比 DATEMID 简洁多少它的优势在于处理带分隔符的复杂字符串。如果非要用可以这样LET(d, MID(A2,7,8), DATE(LEFT(d,4), MID(d,5,2), RIGHT(d,2)))这里用了 LET 函数先把 MID 结果存成变量 d避免重复计算然后用 LEFT、MID、RIGHT 分别取年月日。这个写法比嵌套三个 MID 更易读性能也略好因为 MID 只算了一次。LET 是 365 版本的新函数老版本用不了但如果你有强烈建议用起来公式可读性提升明显。4.2 快速填充的适用边界快速填充Flash Fill是 Excel 2013 之后的功能快捷键是 CtrlE。用法很简单在第一个身份证号旁边手动输入出生日期比如 1990/5/12然后选中这个单元格按 CtrlEExcel 会自动识别规律并填充整列。这个方法在数据规整的时候非常好用几乎不用动脑。但它有几个硬伤第一它靠模式识别数据一乱就可能填错比如混着 15 位和 18 位的时候容易翻车第二填充结果是静态值源数据改了不会自动更新第三数据量大的时候几万条以上会明显卡顿。所以我的建议是临时处理、数据量小、格式统一的时候用快速填充正式台账、需要长期维护的表格老老实实用 DATEMID。4.3 三种方法的选型对照为了让你一眼看清什么时候用哪个我整理了个对照表方法返回类型能否计算兼容15位适用版本推荐场景MIDTEXT文本否需改造全版本仅需显示不参与运算DATEMID日期值是是全版本正式台账、需计算年龄工龄快速填充静态值是否2013临时处理、数据量小选型逻辑其实就一句话要计算就用 DATE只要看就用 TEXT图省事且数据干净就用快速填充。我自己的习惯是但凡这个表要留存超过一周一律用 DATE 方法省得后面返工。5. 格式化环节提取出来只是半成品很多人以为公式跑出结果就完事了其实格式化才是决定这张表能不能用的关键。提取出来的日期如果格式不对导出、打印、对接系统的时候全是麻烦。5.1 单元格格式设置的三个层次日期格式化分三个层次。第一层是单元格格式右键设置单元格格式选日期然后挑 yyyy-mm-dd 或者 yyyy/mm/dd。这一层只改显示不改实际值。第二层是 TEXT 函数格式化直接把值转成指定格式的文本这一层改的是实际内容。第三层是自定义格式代码比如yyyy年m月d日能拼出中文日期。日常台账我推荐第一层保留日期本质显示又好看如果要导出给不支持日期格式的系统用第二层。5.2 批量统一格式的实操步骤假设你已经用 DATE 方法提取了一列日期现在要统一成 yyyy-mm-dd。步骤是选中整列Ctrl1 打开设置单元格格式在数字选项卡里选自定义在类型框里输入yyyy-mm-dd确定。这时候显示就统一了。如果发现有的单元格没变大概率是那些单元格本身是文本格式需要先选中列设置成常规或日期再重新设置自定义格式。我遇到过最坑的情况是从别的系统导出的日期带着不可见字符看着是日期实际是文本这种得先用 CLEAN 函数清洗一遍再格式化。5.3 导出和打印时的格式陷阱导出 CSV 的时候日期格式最容易出问题。CSV 是纯文本格式不保留单元格格式所以你设置的 yyyy-mm-dd 可能变成 1990/5/12 或者 44927 这种序列值。解决办法是在导出前用 TEXT 函数把日期转成文本比如TEXT(B2,yyyy-mm-dd)这样导出后格式就固定了。打印的时候则是另一个坑如果列宽不够日期会显示成 ####这时候要么拉宽列要么缩小字号要么把格式改成 yy-mm-dd 这种短格式。我一般会在打印前用页面布局视图预览一遍确认没有 #### 再打。6. 踩过的坑和实测经验这部分是我这些年处理身份证数据攒下来的实战教训每一条都是真金白银换来的希望能帮你少走弯路。6.1 身份证号变成科学计数法怎么救这是最高频的问题。18 位身份证号一旦被 Excel 识别成数字后三位直接变 0而且不可逆。预防方法是在输入前把整列设成文本格式或者输入时先打一个英文单引号。如果已经变了只能从原始数据源重新导入。导入的时候有个技巧用数据选项卡的从文本/CSV导入在向导第三步把身份证号列指定为文本这样就不会被转换。千万别用直接复制粘贴的方式那是重灾区。6.2 校验码是 X 时的处理18 位身份证最后一位可能是 X这会影响 LEN 函数的判断吗不会LEN 照样算 18。但如果你的公式里用了 VALUE 或者数学运算X 会导致报错。所以提取出生日期的时候只取第 7 到 14 位不碰最后一位就不会有问题。我见过有人用 RIGHT 取校验码做性别判断结果 X 报错那是另一个场景的问题了。6.3 日期合法性校验不能省理论上身份证里的日期都是合法的但实际数据里偶尔会有脏数据比如月份是 13、日期是 32。DATE 函数遇到这种会自动进位13 月变成次年 1 月32 号变成下月 1 号结果就错了。所以正式台账里我会加一层校验IF(ISERROR(DATE(MID(A2,7,4),MID(A2,11,2),MID(A2,13,2))), 日期异常, DATE(MID(A2,7,4),MID(A2,11,2),MID(A2,13,2)))不过 DATE 其实很少报错更稳妥的校验是判断月份是否在 1-12、日期是否在 1-31以及结合月份判断日期上限。这个看数据质量决定要不要加数据源可靠的话可以省。6.4 大批量数据下的性能优化几万条数据的时候公式嵌套太深会明显卡顿。优化思路有三个一是用 LET 函数减少重复计算把 MID 结果存成变量二是把公式列算完后复制选择性粘贴成值去掉公式依赖三是如果数据量超过十万条建议用 Power Query 处理它的 M 语言处理文本比工作表函数快得多。我处理过一批 8 万条的学员数据用 DATEMID 下拉的时候卡了将近一分钟后来改成 Power Query几秒钟就跑完了。6.5 一个容易被忽略的细节前导零月份和日期如果是 1 月、1 日MID 取出来是 01DATE 能正确识别。但如果你用 TEXT 方法格式代码写成 0000-0-0那 1 月会显示成 1 而不是 01格式就不统一了。所以 TEXT 的格式代码一定要用 0000-00-00两个 0 保证补零。这个细节很小但导出数据的时候格式不统一会被下游系统拒收我吃过这个亏。7. 把方法固化下来做成模板和自定义函数如果你经常要处理身份证数据每次都写公式太累可以把它固化下来。两个思路一是做成模板表公式预置好以后只管粘贴数据二是写个自定义函数用 VBA 封装调用的时候一个函数名搞定。7.1 模板表的搭建要点模板表的核心是把公式列预置好并且锁定防止误改。具体做法第一行放表头第二行开始放公式公式里引用 A 列然后把公式列的保护打开。以后用的时候把身份证号粘贴到 A 列B 列的出生日期自动出来。注意粘贴身份证号的时候要用选择性粘贴-值避免把源格式带进来。模板表我一般会存成 xltx 格式双击新建不会覆盖原模板。7.2 用 VBA 写一个身份证提取函数如果你会用 VBA可以写个自定义函数用起来更顺手。按 AltF11 打开编辑器插入模块粘贴下面代码Function GetBirthDate(idCard As String) As Variant Dim idLen As Integer idLen Len(idCard) If idLen 18 Then GetBirthDate DateSerial(Mid(idCard, 7, 4), Mid(idCard, 11, 2), Mid(idCard, 13, 2)) ElseIf idLen 15 Then GetBirthDate DateSerial(19 Mid(idCard, 7, 2), Mid(idCard, 9, 2), Mid(idCard, 11, 2)) Else GetBirthDate CVErr(xlErrValue) End If End Function保存后回到工作表输入GetBirthDate(A2)就能直接出日期。这个函数的好处是兼容 15 位和 18 位返回真正的日期值而且公式简洁。注意保存文件的时候要存成 xlsm 格式否则 VBA 代码会丢。另外如果公司有宏安全策略可能需要调整信任设置这个看具体环境。7.3 模板的版本管理和交接模板做出来之后建议加个版本号和更新日期放在表格的某个角落或者批注里。交接给同事的时候附一个简短说明写清楚哪列填数据、哪列是公式不要动、遇到 15 位怎么办。我见过太多模板因为交接不清被后来的人改得面目全非。另外如果模板要发给外部记得把 VBA 代码去掉或者加密避免宏安全提示吓到对方。8. 几个延伸场景的处理思路身份证提取出生日期只是起点实际工作里往往还有一连串衍生需求。这里挑几个常见的说说思路具体公式就不展开了逻辑都是相通的。8.1 从出生日期算年龄有了标准日期算年龄就简单了用 DATEDIFDATEDIF(B2, TODAY(), Y)B2 是出生日期TODAY() 是当前日期Y 表示返回整年数。这个函数算出来的年龄是精确到周岁的比直接用年份相减准确。注意 DATEDIF 是隐藏函数输入的时候没有提示但能用。8.2 按出生日期分段统计做人力分析的时候经常要按年龄段分组比如 25 岁以下、26-35、36-45 等。思路是用 IF 或者 IFS 嵌套基于年龄列做判断。数据量大的话用数据透视表更省事把出生日期拖到行区域Excel 会自动按年、季度、月分组右键组合还能自定义分段。8.3 身份证号脱敏显示台账里身份证号是敏感信息展示的时候通常要脱敏比如只显示前 6 位和后 4 位中间用星号代替LEFT(A2,6) ******** RIGHT(A2,4)这个公式简单直接18 位身份证脱敏后是 684 的结构。如果是 15 位中间星号数量要调整可以用 REPT 函数动态生成。脱敏后的数据可以放心用于展示和分享原始数据单独存放。8.4 批量校验身份证位数导入数据后第一件事应该是校验位数把不是 15 位也不是 18 位的挑出来IF(OR(LEN(A2)15, LEN(A2)18), 正常, 位数异常)这个校验能快速定位脏数据比一条条看高效得多。配合条件格式把异常的行标红一眼就能看到问题在哪。9. 关于工具选择的一点个人看法说了这么多方法最后聊聊工具选择。Excel 处理身份证数据胜在门槛低、上手快几千条数据以内完全够用。但如果数据量上了十万级或者需要频繁重复处理Excel 就开始吃力了。这时候可以考虑几个方向Power Query 适合做数据清洗和转换一次配置反复用Python 的 pandas 适合大批量处理几行代码搞定几百万条数据库适合做长期存储和复杂查询。不过对大多数人来说Excel 的三个方法已经能覆盖 90% 的场景没必要为了炫技上重型工具。工具是拿来解决问题的不是拿来增加复杂度的。我在实际使用中发现真正决定效率的不是用了多高级的函数而是数据源本身干不干净。如果身份证号在录入环节就规范成文本格式后面提取出生日期就是一行公式的事。所以与其在提取环节折腾各种兼容写法不如从源头把数据质量管起来。这个道理放在任何数据处理场景都成立。
返回列表