身份证处理函数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位的主要内容,如果未能解决你的问题,请参考以下文章

身份证号如何提取信息?

EXCEL表格中 怎么用函数从身份证号获取出生日期,年龄、性别

如何利用身份证号码计算出生年月,年龄及性别

Excel技巧 根据身份证识别性别、出生日期、年龄和生肖!

excel如何通过身份证计算性别和年龄

IOS 根据身份证号码获取 年龄 生日 性别