ORACLE对身份证号码处理相关的SQL汇总

          目前我国大量存在着正在有效期的15位身份证,虽然国家在推行二代身份证,但尚未发现强行要求全国人民更换未到期的15位身份证的官方声明或公告。
          扯远了:),总之合法的15位身份证号码将在今后一段时间内继续存在下去。

         另外,项目中往往有着大量的历史数据,我们的一个系统中15位身份证所占比重很大,因此系统必须实现对两套身份证编码的职能处理,并支持另外一种特殊证件类型:军官证/警官证。本文重点讨论15位/18位身份证的处理问题

         众所周知,我们现执行的身份证号码编码由公安部具体落实编码规则,有15位/18位两种,公安部以数学语言描述的方式公开了身份证编码规则和位码含义,但具体到计算机语言实现,需要开发人员自行根据算法设计。网上流传版本不少,不过繁杂而凌乱,且与应用集合描述的不多。现结合项目实践谈谈其处理和用途。
         本文主要以oracle的SQL为例子,其他语言大家可以自行转换,道理都是一样的。

这里以ORACLE为例,其他数据库非常类似:

1 号码转换问题       
create or replace ID15TO18(p_OldID varchar2) return varchar2 is
   type TIArray is table of integer;
   type TCArray is table of char(1);
   Result varchar2(18);
   W TIArray;
   A TCArray;
   S integer;
begin
   if Length(p_OldID) <> 15 OR  NOT ISIDCARD(p_OldID) then
--raise_application_error(-20999, '不是旧15位身份证号或者不是身份证号');
   Result := p_OldID;
   else

   W := TIArray(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1);
   A := TCArray('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
   Result := SubStr(p_OldID, 1, 6) || '19' || SubStr(p_OldID, 7, 9);

   S := 0;
   begin
      for i in 1 .. 17 loop
      S := S + to_number(SubStr(Result, i, 1)) * W(i);
      end loop;
      exception
      when others then
      return '';
   end;
      S := S mod 11;
      Result := Result || A(s + 1);

   end if;

   return(Result);
end ID15TO18;
/

2 判断是否为身份证号码
create or replace isIDCard(p_IDcard varchar2) return boolean is

IDcardlen integer;

begin

  IDcardlen :=Length(p_IDcard); 
  
  if (IDcardlen = 18 and IS_NUMBER(SubStr(p_IDcard, 1, IDcardlen-1))
                     and IS_DATE (substr(p_IDcard,7,8)))
                    or                   
     (IDcardlen = 15 and IS_NUMBER(SubStr(p_IDcard, 1, IDcardlen))
                     and IS_DATE ('19' || subsTR(p_IDcard,7,6)))         
  then

      return TRUE;
     
      ELSE
         return FALSE;
   end if;
     
end isIDCard;
/

3 获取年龄,那获取生日类似,也就不show了
create or replace getAge(p_IDcard varchar2) return integer is

IDcardlen integer;
IDcardyear integer;

begin

  IDcardlen :=Length(p_IDcard); 
 
   if isidcard(p_IDcard)=1 and IDcardlen = 18 then
     IDcardyear := to_number(substr(p_IDcard,7,4)); 
  end if;
  if isidcard(p_IDcard)=1 and IDcardlen = 15 then 
     IDcardyear := to_number('19'||substr(p_IDcard,7,2));
  end if;
  
  return  to_number(to_char(sysdate,'yyyy'))-IDcardyear;  
  
     
end getAge;

4 获取性别

create or replace getSex(p_IDcard varchar2) return varchar2 is

IDcardlen integer;

begin

  IDcardlen :=Length(p_IDcard); 
 
  if isidcard(p_IDcard)<>1 then
      return null;
  end if;
  
      if IDcardlen = 18 and Substr(p_IDcard,17,1) in (1,3,5,7,9) then 
          return ('男');
      end if; 
     if IDcardlen = 18 and Substr(p_IDcard,17,1) in (2,4,6,8,0)then 
              return ('女');
      end if; 

      if IDcardlen = 15 and  Substr(p_IDcard,15,1) in (1,3,5,7,9) then 
          return ('男');
      end if; 
      if IDcardlen = 15 and Substr(p_IDcard,15,1) in (2,4,6,8,0)then 
              return ('女');
      end if; 
     
end getSex;

    (三)总结用途

主要结合某实际项目,说三点:

(1)实现15位/18位身份证号码智能登录
     登录时,如果库里的是15位,系统用18位号码登录,应提示相关信息,辅助完成系统登录。
     反之,提示用户号码输入不正确。


(2)自动升级库中的身份证号码从15位到18位
   
     这个当然不能轻易机械的升级了,不过如果有重复数据时,判断重复数据,保留最新号码信息绝对是个好办法,如同时存在15位和18位,是否可以留18位就可以了?

(3)智能校验:判断身份证输入,以及关联的性别、出生年月等是否正确
 
     按公安部门发布的号码规则校验,当然是有效和有用的:)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
身份证号校验器是一个可以用来验证身份证号码是否有效的验证工具。 特点: 1、支持批量输入验证 2、支持从数据库读取验证 3、支持SQL SERVER 4、支持ORACLE 根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 第一、二位表示省(自治区、直辖市、特别行政区)。 第三、四位表示市(地级市、自治州、盟及国家直辖市所属市辖区和县的汇总码)。其中,01-20,51-70表示省直辖市;21-50表示地区(自治州、盟)。 第五、六位表示县(市辖区、县级市、旗)。01-18表示市辖区或地区(自治州、盟)辖县级市;21-80表示县(旗);81-99表示省直辖县级市。 第七、十四位表示出生年月日(单数字月日左侧用0补齐)。其中年份用四位数字表示,年、月、日之间不用分隔符。 第十五、十七位表示顺序码。对同地区、同年、月、日出生的人员编定的顺序号。其中第十七位奇数分给男性,偶数分给女性。 第十八位表示校验码。作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,校验码如果出现数字10,就用X来代替 中国居民身份证校验码算法: 将身份证号码前面的17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。 将这17位数字和系数相乘的结果相加。 用加出来和除以11,取余数。 余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证号码为1-0-X-9-8-7-6-5-4-3-2。 通过上面计算得知如果余数是3,第18位的校验码就是9。如果余数是2那么对应的校验码就是X,X实际是罗马数字10。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值