MySql整理篇之身份证提取生日性别

应用场景

某些场景中,需要从国人身份证号中提取出生日期及性别,现整理出MySql版本的提取方法,了解其规则后,其他数据库异曲同工。
目前国人身份证分为一代和二代,一代15位,二代18为。基本区分如下:

18位证件号

1~6位为地区省市县编码,7~14位出生年月日,15~16所在地派出所,17位性别(奇男、偶女),18位为校验码

15位证件号

1~6位为地区省市县编码,7~12位出生年月日(年为两位),13~15为顺序码,末位区分男女(奇男、偶女)。

解决方案

解决方案为根据证件号规则,创建两个函数:fun_idno_birthday、fun_idno_sex提取。

出生日期提取

通过创建函数fun_idno_birthday获取,具体代码如下:

DELIMITER $$
DROP FUNCTION IF EXISTS fun_idno_birthday$$
CREATE FUNCTION fun_idno_birthday(idno  VARCHAR(25)) RETURNS VARCHAR(10) CHARSET utf8
BEGIN 
    DECLARE v_birth VARCHAR(10) DEFAULT NULL;
    DECLARE v_birth_1 VARCHAR(10) DEFAULT NULL;
    DECLARE v_birth_2 VARCHAR(10) DEFAULT NULL;
    IF idno IS NULL OR '' = idno THEN RETURN NULL; END IF;
    IF LENGTH(idno) = 18 THEN 
        SET v_birth = SUBSTRING(idno,7,8);
        SET v_birth_1 = LEFT(v_birth,4);
        SET v_birth_2 = RIGHT(v_birth,4);
        SET v_birth = CONCAT(v_birth_1,'-',LEFT(v_birth_2,2),'-',RIGHT(v_birth_2,2));
        RETURN v_birth;
    END IF;
    IF LENGTH(idno) = 15 THEN
        SET v_birth = CONCAT('19',SUBSTRING(idno,7,6));
        SET v_birth_1 = LEFT(v_birth,4);
        SET v_birth_2 = RIGHT(v_birth,4);
        SET v_birth = CONCAT(v_birth_1,'-',LEFT(v_birth_2,2),'-',RIGHT(v_birth_2,2));
        RETURN v_birth;
    END IF;
    RETURN NULL;
END$$
DELIMITER ;

性别提取

通过创建函数fun_idno_sex获取,具体代码如下:

DELIMITER $$
DROP FUNCTION IF EXISTS fun_idno_sex$$
CREATE FUNCTION fun_idno_sex(idno  VARCHAR(25)) RETURNS VARCHAR(10) CHARSET utf8
BEGIN 
    DECLARE v_num VARCHAR(10) DEFAULT NULL;
    IF idno IS NULL OR '' = idno THEN RETURN NULL; END IF;
    -- 倒数第二位为性别
    IF LENGTH(idno) = 18 THEN 
        SET v_num = LEFT(RIGHT(idno,2),1);
        IF v_num % 2 = 0 THEN RETURN '0';-- 偶女
        ELSE RETURN '1';-- 奇男
        END IF;
    END IF;
    -- 倒数第一位为性别
    IF LENGTH(idno) = 15 THEN
        SET v_num = RIGHT(idno,1);
        IF v_num % 2 = 0 THEN RETURN '0';-- 偶女
        ELSE RETURN '1';-- 奇男
        END IF;
    END IF;
    RETURN NULL;
END$$
DELIMITER ;

使用方法

直接在逻辑中使用,传递证件号作为参数。

SELECT fun_idno_birthday('52022119890408407X');
SELECT fun_idno_birthday('370986890623212');
SELECT fun_idno_sex('52022119890408407X');
SELECT fun_idno_sex('370986890623212');

注意: fun_idno_sex返回值:0-女 1-男,NULL为非有效证件号

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一人带俩娃长途旅行第二十三天 成都站的最后一天,终于见到了老朋友米粒,想起来当时在上海的NLP工作坊上,我们俩是最...
    Ada岳慧阅读 220评论 2 2
  • 死玫瑰阅读 66评论 0 0
  • 2016年到了,伴随着所有的喜怒哀乐迈过了新的一年。可以说是长大了一岁,又或者是老了一岁,长大的是我们见识了从没见...
    扭曲人阅读 281评论 0 0
  • 生而为人,我很孤独。 这是村上春树的《没有女人的男人们》这本书给我的感受。 这本书名或者叫《失去女人的男人们》更为...
    鱼鱼伢阅读 379评论 1 4