身份证处理函数Mysql篇含获取性别年龄15位身份证升级到18位
Posted ShenLiang2025
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了身份证处理函数Mysql篇含获取性别年龄15位身份证升级到18位相关的知识,希望对你有一定的参考价值。
mysql 15位身份证升级18位函数案例
简介
基于mysql实现对较老的身份证(15)位升级成18位、围绕身份证计算出性别、从身份证里提取年龄。
获取性别
--1从身份证里提取出性别
CREATE FUNCTION getGender(idcard varchar(50)) RETURNS varchar(50) CHARSET utf8
BEGIN
DECLARE out_gender VARCHAR(4);
DECLARE V_SEX VARCHAR(4);
IF LENGTH(idcard)=18
THEN
SET V_SEX= SUBSTRING(idcard,17,1) ;
IF V_SEX%2=0
THEN
SET out_gender='0' ;
else
SET out_gender='1';
end if;
ELSEIF
LENGTH(idcard)=15
THEN
SET V_SEX= SUBSTRING(idcard,15,1) ;
IF V_SEX%2=0
THEN
SET out_gender='0';
else
SET out_gender='1';
end if;
ELSE
SET out_gender='3';
END IF;
RETURN out_gender;
END
-- 验证
SELECT getGender('361515890223081')
--结果
1
获取年龄
-- 通过身份证获取年龄,注该函数需要跟getId一起使用。
CREATE FUNCTION getAge(idcard varchar(50)) RETURNS varchar(50) CHARSET utf8
BEGIN
DECLARE out_age VARCHAR(20);
DECLARE V_idcard VARCHAR(20);
DECLARE C_PK VARCHAR(20);
IF LENGTH(idcard)=15 THEN
SET V_idcard=getId(idcard);
ELSE
SET V_idcard=idcard ;
END IF;
IF LENGTH(V_idcard)=18 THEN
SET out_age=DATE_FORMAT(curdate(),'%Y')-substr(V_idcard,7,4) ;
ELSE
SET out_age=0;
END IF ;
IF out_age >=100 OR out_age<0 THEN
SET out_age=0;
END IF;
RETURN out_age;
END
--验证
SELECT getAge('361515890223081')
--结果
32
15位升级18位
--老的15位身份证升级到18位
CREATE FUNCTION getId(idcard varchar(50)) RETURNS varchar(50) CHARSET utf8
BEGIN
DECLARE new_idcard varchar(20) DEFAULT '' ;
DECLARE id_len varchar(20) DEFAULT '' ;
SET id_len=LENGTH(TRIM(idcard));
IF id_len =15 THEN
SET new_idcard=CONCAT
(
SUBSTRING(idcard,1,6), -- 取第1到6位,即前6位
(CASE WHEN SUBSTRING(idcard,7,2)>SUBSTRING(YEAR(CURDATE()),3,2) -- 补年份,这里假设不会有百岁的情况
THEN '19'
ELSE '20'
END)
,SUBSTRING(idcard,7,9) -- 从第7位往后取9位,或者写成SUBSTRING(idcard,7)
,( -- 计算校验位,即对公开算法的SQL实现
CASE (
(SUBSTRING(idcard,1,1)*7+
SUBSTRING(idcard,2,1)*9+
SUBSTRING(idcard,3,1)*10+
SUBSTRING(idcard,4,1)*5+
SUBSTRING(idcard,5,1)*8+
SUBSTRING(idcard,6,1)*4+
(CASE WHEN SUBSTRING(idcard,7,2)>SUBSTRING(YEAR(CURDATE()),3,2)
THEN 1*2+9*1
ELSE 2*2+0*1
END)+
SUBSTRING(idcard,7,1)*6+
SUBSTRING(idcard,8,1)*3+
SUBSTRING(idcard,9,1)*7+
SUBSTRING(idcard,10,1)*9+
SUBSTRING(idcard,11,1)*10+
SUBSTRING(idcard,12,1)*5+
SUBSTRING(idcard,13,1)*8+
SUBSTRING(idcard,14,1)*4+
SUBSTRING(idcard,15,1)*2
)%11)
WHEN 0 THEN '1'
WHEN 1 THEN '0'
WHEN 2 THEN 'X'
WHEN 3 THEN '9'
WHEN 4 THEN '8'
WHEN 5 THEN '7'
WHEN 6 THEN '6'
WHEN 7 THEN '5'
WHEN 8 THEN '4'
WHEN 9 THEN '3'
WHEN 10 THEN '2'
ELSE 'FALSE'
END )
);
else
set new_idcard=idcard;
end if;
RETURN new_idcard;
END
--验证与结果
SELECT getId('361515890223081')
--结果
361515198902230819
以上是关于身份证处理函数Mysql篇含获取性别年龄15位身份证升级到18位的主要内容,如果未能解决你的问题,请参考以下文章