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

身份证号码算法及应用场景:

工作实践总结,与大家分享快乐,并请高人批评指正,努力改进:

目前我国大量存在着正在有效期的15位身份证,虽然国家在推行二代身份证,但尚未发现强行要求全国人民更换未到期的15位身份证的官方声明或公告。

扯远了:),总之合法的15位身份证号码将在今后一段时间内继续存在下去。

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

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

本文主要以oracle的SQL为例子,其他语言大家可以自行转换,道理都是一样的。

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

--1 号码转换问题

create or replace ID15TO18(p_OldID varchar2) return varchar2 istype TIArrayis table of integer;

type TCArrayis table of char(1);

Resultvarchar2(18);

W TIArray;

A TCArray;

Sinteger;begin

if Length(p_OldID) <> 15 OR NOT ISIDCARD(p_OldID) then

--raise_application_error(-20999, '不是旧15位身份证号或者不是身份证号');

Result :=p_OldID;elseW := 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 .. 17loop

S := S + to_number(SubStr(Result, i, 1)) *W(i);endloop;

exceptionwhen others then

return '';end;

S := S mod 11;

Result := Result || A(s + 1);end if;return(Result);endID15TO18;--2 判断是否为身份证号码

create or replace isIDCard(p_IDcard varchar2) return boolean isIDcardleninteger;beginIDcardlen :=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

returnTRUE;ELSE

returnFALSE;end if;endisIDCard;--3 获取年龄,那获取生日类似,也就不show了

create or replace getAge(p_IDcard varchar2) return integer isIDcardleninteger;

IDcardyearinteger;beginIDcardlen :=Length(p_IDcard);if isidcard(p_IDcard)=1 and IDcardlen = 18 thenIDcardyear := to_number(substr(p_IDcard,7,4));end if;if isidcard(p_IDcard)=1 and IDcardlen = 15 thenIDcardyear := to_number('19'||substr(p_IDcard,7,2));end if;return to_number(to_char(sysdate,'yyyy'))-IDcardyear;endgetAge;--3 获取年龄,精确到日

create or replace getAge(p_IDcard varchar2) return integer isIDcardleninteger;

IDcardyearinteger;beginIDcardlen :=Length(p_IDcard);if isidcard(p_IDcard)=1 and IDcardlen = 18 thenIDcardyear := to_number(substr(p_IDcard,7,8));end if;if isidcard(p_IDcard)=1 and IDcardlen = 15 thenIDcardyear := to_number('19'||substr(p_IDcard,7,6));end if;return to_number(to_char(sysdate,'yyyyMMdd'))-IDcardyear;endgetAge;--4 获取性别

create or replace getSex(p_IDcard varchar2) return varchar2 isIDcardleninteger;beginIDcardlen :=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;endgetSex;/*(三)总结用途

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

(1)实现15位/18位身份证号码智能登录

登录时,如果库里的是15位,系统用18位号码登录,应提示相关信息,辅助完成系统登录。

反之,提示用户号码输入不正确。

(2)自动升级库中的身份证号码从15位到18位

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

(3)智能校验:判断身份证输入,以及关联的性别、出生年月等是否正确

按公安部门发布的号码规则校验,当然是有效和有用的:)*/

oracle 导出身份证号_ORACLE对身份证号码处理相关的SQL【收藏】相关推荐

  1. oracle 导出身份证号_ORACLE对身份证号码处理相关的SQL汇总

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

  2. oracle 导出身份证号_oracle解析身份证号码.sql

    -- 创建一个表 drop table employee ;create table employee ( NO number(4) primary key not null  , NAME varc ...

  3. oracle 导出身份证号_oracle 根据身份证号计算出生日期

    1.情景展示 如何根据身份证号推算出出生日期? 2.解决方案 --根据身份证号计算出生日期 SELECT DECODE(LENGTH(ID_CARD), 18, SUBSTR(ID_CARD, 7, ...

  4. 证件类型为身份证号时进行身份证校验

    需求:代办人身份证号改为代办人证件类型(默认为身份证号),后面跟着号码,房主和代办人的证件类型为身份证号时进行身份证校验 效果: sf_ghgl_add.jsp <td class=" ...

  5. 使用js验证身份证号格式以及身份证号中的生日验证

    由于不管是测试项目练手还是实际项目开发,都应该考虑数据的严密性和软件的通俗易懂的实用性,下面是我用js实现的验证身份证号格式以及身份证号中的生日验证代码 //生日移出点击事件验证身份证号中的生日验证 ...

  6. 判断身份证号,根据身份证号自动生成出生日期

    判断身份证号,根据身份证号自动生成出生日期 idCodeValid(rule, value, callback) => {let reg = /(^[1-9]\d{5}(18|19|([23]\ ...

  7. 提取身份证号,解析身份证号出生年月、出生地、性别 的Python 实现与在线使用工具

    从一篇文本中,抽取出所包含的 身份证号 并解析出其中的 省.市.县.出生年月.性别.校验码.  这个功能,JioNLP帮你实现 源码在 github:JioNLPhttps://github.com/ ...

  8. oracle手机号码检验字数_oracle 检验身份证号是否正确基本方法

    此前在文章中给出了函数和存储过程是如何判断身份证号是否是正确的,下面我详列下判断方法: 1.号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地 ...

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

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

最新文章

  1. 解题报告(三)多项式求值与插值(拉格朗日插值)(ACM / OI)
  2. 程序员的节日怎么过?
  3. 竞争解决定时器时长( mac-ContentionResolutionTimer)
  4. 剑指offer和LeetCode题目笔记
  5. 使用composer_在Google Cloud Composer(Airflow)上使用Selenium搜寻网页
  6. nodejs核心模块fs删除文件_用 NodeJS 重命名系统文件
  7. 第八章 丹药吃坏人了
  8. CCF201703试题
  9. 【蓝桥杯】2019:最长子序列
  10. 汇编语言之DOSBox的安装和使用
  11. 怎样才能通过c语言二级考试,如何一次就通过全国计算机二级C语言考试,高分技巧四部曲...
  12. python画流程_使用Graphviz快速绘制流程图
  13. [论文笔记] EMNLP2019: A Lexicon-Based Graph Neural Network for Chinese NER
  14. python计算对数收益率_对数收益率怎么转成年化收益率?怎么计算夏普比率?
  15. sonarqube中 项目名称 问题
  16. golang之jsonb类型的支持
  17. Linux运维工程师综合面试题
  18. zynq嵌入式linux显示logo,如何定制嵌入式linux 启动logo(小企鹅)
  19. 小三上位中的数学问题
  20. Mycat2分库分表

热门文章

  1. 游戏设计文档的功能及类型
  2. 不能装载文档控件。请在检查浏览器的选项中检查浏览器的安全设置_【网络安全知识系列(五)】如何正确设置浏览器!...
  3. 2019备考[嵌入式系统设计师]你准备好了吗?
  4. ffmpeg 将一个视频裁剪多个部分,然后合并所有的裁剪为一个视频
  5. 单相全桥逆变原理及仿真实验
  6. 玩客云pc端_玩客云pc端
  7. 解决 E45: 'readonly' option is set (add ! to override)
  8. 快手极速版——青龙羊毛
  9. android storagemanager来获取u盘名称,StorageManager获取U盘挂载状态
  10. Consider defining a bean of type `xxx` in your configuration问题解决