身份证号第7至14位为出生日期,但须先校验18位纯数字格式;非标准号码需清洗或补前缀;截取后须转为日期类型(如str_to_date)方可正确排序计算,且update/select操作必须加where条件过滤合规数据。

身份证号第7到第14位就是出生日期,但得确认格式是否标准
18位身份证号的出生日期固定在第7~14位(共8个字符),形如19900307。但实际数据中常混有15位旧版号码(无年份前两位)、空格、字母、缺失值或全角字符——直接SUBSTRING会出错或返回空/乱码。
实操建议:
- 先用
LENGTH()和REGEXP_LIKE()(Oracle/MySQL 8.0+)或LIKE粗筛:只处理LENGTH(id_card) = 18且id_card NOT LIKE '%[^0-9]%'的记录 - 对15位号码可补“19”前缀再截取第7~12位,但需业务确认是否接受该假设(1900–1999年间出生)
- PostgreSQL要用
substring(id_card from 7 for 8);SQL Server用SUBSTRING(id_card, 7, 8);MySQL/Oracle统一用SUBSTRING(id_card, 7, 8)
SUBSTRING截出来是yyyymmdd,要转成日期类型才能计算或排序
SUBSTRING返回的是字符串,不是DATE。如果直接ORDER BY SUBSTRING(id_card, 7, 8),会出现20010101排在19991231前面这种字典序错误。
实操建议:
- MySQL:用
STR_TO_DATE(SUBSTRING(id_card, 7, 8), '%Y%m%d') - PostgreSQL:用
TO_DATE(SUBSTRING(id_card, 7, 8), 'YYYYMMDD') - SQL Server:用
CONVERT(DATE, SUBSTRING(id_card, 7, 8), 112)(112 = yyyymmdd格式码) - Oracle:用
TO_DATE(SUBSTRING(id_card, 7, 8), 'YYYYMMDD')
遇到NULL、短于18位或含非数字字符时,SUBSTRING会静默返回空或报错
不同数据库行为不一致:MySQL的SUBSTRING对越界位置返回空字符串;SQL Server会返回NULL;Oracle在TO_DATE转换失败时直接报ORA-01861错误。
实操建议:
- 加
CASE WHEN兜底:CASE WHEN LENGTH(id_card) = 18 AND id_card REGEXP '^[0-9]{18}$' THEN STR_TO_DATE(SUBSTRING(id_card, 7, 8), '%Y%m%d') END - 避免在WHERE里直接用转换后字段筛选(如
WHERE STR_TO_DATE(...) > '2000-01-01'),会导致全表扫描——应先用字符串条件过滤,再转换 - 建表达式索引(如MySQL 8.0+):
CREATE INDEX idx_birthday ON users ((STR_TO_DATE(SUBSTRING(id_card, 7, 8), '%Y%m%d')))
批量更新表时别忘了加WHERE条件,否则可能把所有生日改成NULL
想把出生日期存进新字段birthday DATE?写UPDATE users SET birthday = STR_TO_DATE(SUBSTRING(id_card, 7, 8), '%Y%m%d')没加WHERE,所有记录的birthday都会被设为NULL(因部分id_card不合规)。
实操建议:
- 先用
SELECT COUNT(*)验证合规数据量:SELECT COUNT(*) FROM users WHERE LENGTH(id_card) = 18 AND id_card REGEXP '^[0-9]{18}$' - UPDATE语句必须带相同WHERE:
UPDATE users SET birthday = STR_TO_DATE(SUBSTRING(id_card, 7, 8), '%Y%m%d') WHERE LENGTH(id_card) = 18 AND id_card REGEXP '^[0-9]{18}$' - 执行前在测试库跑一遍,再查
SELECT * FROM users WHERE birthday IS NULL AND LENGTH(id_card) = 18确认是否还有漏网数据
真正麻烦的从来不是SUBSTRING本身,而是身份证号在现实数据里根本不像文档写的那么规整——多一位少一位、字母O当零、OCR识别成“Q”、手工录入空格……这些细节不提前卡住,后面日期运算、年龄计算、报表分组全会偏。










