oracle_函数身份证15位转18位
ORACLE对身份证号码处理的相关SQL汇总
ORACLE对身份证号码处理相关的SQL汇总身份证号码算法及应用场景:工作实践总结,与大家分享快乐,并请高人批评指正,努力改进:目前我国大量存在着正在有效期的15位身份证,虽然国家在推行二代身份证,但尚未发现强行要求全国人民更换未到期的15位身份证的官方声明或公告。
扯远了:),总之合法的15位身份证号码将在今后一段时间内继续存在下去。
另外,项目中往往有着大量的历史数据,我们的一个系统中15位身份证所占比重很大,因此系统必须实现对两套身份证编码的职能处理,并支持另外一种特殊证件类型:军官证/警官证。
本文重点讨论15位/18位身份证的处理问题众所周知,我们现执行的身份证号码编码由公安部具体落实编码规则,有15位/18位两种,公安部以数学语言描述的方式公开了身份证编码规则和位码含义,但具体到计算机语言实现,需要开发人员自行根据算法设计。
本文主要以oracle的SQL为例子,其他语言大家可以自行转换,道理都是一样的。
这里以ORACLE为例,其他数据库类似:CREATE OR REPLACE function ID15TO18(p_OldID varchar2) return varchar2 istype TIArray is table of integer;type TCArray is table of char(1);Result varchar2(18);W TIArray;A TCArray;S integer;beginif Length(p_OldID) <> 15 OR NOT ISIDCARD(p_OldID) thenraise_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;beginfor i in 1 .. 17 loopS := S + to_number(SubStr(Result, i, 1)) * W(i);end loop;exceptionwhen others thenreturn '';end;S := S mod 11;Result := Result || A(s + 1);end if;return(Result);end ID15TO18;/CREATE OR REPLACE function isIDCard(p_IDcard varchar2) return boolean isIDcardlen integer;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)))*/if (IDcardlen = 18)or(IDcardlen = 15 )thenreturn TRUE;ELSEreturn FALSE;end if;end isIDCard;/CREATE OR REPLACE FUNCTION is_number (str IN VARCHAR2)RETURN NUMBERISBEGINIF str IS NULLTHENRETURN 0;ELSEIF regexp_like (str, '^(-{0,1} {0,1})[0-9] (.{0,1}[0-9] )$')THENRETURN 1;ELSERETURN 0;END IF;END IF;END is_number;/CREATE OR REPLACE function getAge(p_IDcard varchar2) return integer is IDcardlen integer;IDcardyear integer;beginIDcardlen :=Length(p_IDcard);if isidcard(p_IDcard) and IDcardlen = 18 thenIDcardyear := to_number(substr(p_IDcard,7,4));end if;if isidcard(p_IDcard) and IDcardlen = 15 thenIDcardyear := to_number('19'||substr(p_IDcard,7,2));end if;return to_number(to_char(sysdate,'yyyy'))-IDcardyear;end getAge;/CREATE OR REPLACE function getSex(p_IDcard varchar2) return varchar2 is IDcardlen integer;beginIDcardlen :=Length(p_IDcard);if not isidcard(p_IDcard)thenreturn 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;//* Formatted on 2009/05/22 13:35 (Formatter Plus v4.8.6) */ CREATE OR REPLACE FUNCTION is_date (in_date IN VARCHAR2) RETURN BOOLEANISv_date_value DATE;invalid_day EXCEPTION;invalid_month EXCEPTION;PRAGMA EXCEPTION_INIT (invalid_day, -1839);PRAGMA EXCEPTION_INIT (invalid_month, -1843);BEGINSELECT TO_DATE (in_date, 'YYYY-MM-DD')INTO v_date_valueFROM DUAL;RETURN TRUE;EXCEPTIONWHEN invalid_dayTHENRETURN FALSE;WHEN invalid_monthTHENRETURN FALSE;WHEN OTHERSTHENRETURN FALSE;END is_date;/。
身份证号码18位与15位转换
身份证18位与15位转换package cn.crediteasep.tools.util;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.HashMap;import java.util.Map;import java.util.Scanner;import ng.StringUtils;/*** 身份证工具类* @author Kobe* @version 2020-08-08*/public class IdcardUtils extends StringUtils {/** 中国公民身份证号码最小长度。
*/public static final int CHINA_ID_MIN_LENGTH = 15;/** 中国公民身份证号码最大长度。
*/public static final int CHINA_ID_MAX_LENGTH = 18;/** 省、直辖市代码表*/public static final String cityCode[] = {"11", "12", "13", "14", "15", "21", "22", "23", "31", "32", "33", "34", "35", "36", "37", "41","42", "43", "44", "45", "46", "50", "51", "52", "53", "54", "61", "62", "63", "64", "65", "71","81", "82", "91"};/** 每位加权因子*/public static final int power[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};/** 第18位校检码*/public static final String verifyCode[] = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};/** 最低年限*/public static final int MIN = 1930;public static Map<String, String> cityCodes = new HashMap<String, String>();/** 台湾身份首字母对应数字*/public static Map<String, Integer> twFirstCode = new HashMap<String, Integer>();/** 香港身份首字母对应数字*/public static Map<String, Integer> hkFirstCode = new HashMap<String, Integer>();static {cityCodes.put("11", "北京");cityCodes.put("12", "天津");cityCodes.put("13", "河北");cityCodes.put("14", "山西");cityCodes.put("15", "内蒙古");cityCodes.put("21", "辽宁");cityCodes.put("22", "吉林");cityCodes.put("23", "黑龙江");cityCodes.put("31", "上海");cityCodes.put("32", "江苏");cityCodes.put("33", "浙江");cityCodes.put("34", "安徽");cityCodes.put("35", "福建");cityCodes.put("37", "山东"); cityCodes.put("41", "河南"); cityCodes.put("42", "湖北"); cityCodes.put("43", "湖南"); cityCodes.put("44", "广东"); cityCodes.put("45", "广西"); cityCodes.put("46", "海南"); cityCodes.put("50", "重庆"); cityCodes.put("51", "四川"); cityCodes.put("52", "贵州"); cityCodes.put("53", "云南"); cityCodes.put("54", "西藏"); cityCodes.put("61", "陕西"); cityCodes.put("62", "甘肃"); cityCodes.put("63", "青海"); cityCodes.put("64", "宁夏"); cityCodes.put("65", "新疆"); cityCodes.put("71", "台湾"); cityCodes.put("81", "香港"); cityCodes.put("82", "澳门"); cityCodes.put("91", "国外");twFirstCode.put("B", 11); twFirstCode.put("C", 12); twFirstCode.put("D", 13); twFirstCode.put("E", 14); twFirstCode.put("F", 15); twFirstCode.put("G", 16); twFirstCode.put("H", 17); twFirstCode.put("J", 18); twFirstCode.put("K", 19); twFirstCode.put("L", 20); twFirstCode.put("M", 21); twFirstCode.put("N", 22); twFirstCode.put("P", 23); twFirstCode.put("Q", 24); twFirstCode.put("R", 25); twFirstCode.put("S", 26); twFirstCode.put("T", 27); twFirstCode.put("U", 28); twFirstCode.put("V", 29); twFirstCode.put("X", 30); twFirstCode.put("Y", 31);twFirstCode.put("Z", 33);twFirstCode.put("I", 34);twFirstCode.put("O", 35);hkFirstCode.put("A", 1);hkFirstCode.put("B", 2);hkFirstCode.put("C", 3);hkFirstCode.put("R", 18);hkFirstCode.put("U", 21);hkFirstCode.put("Z", 26);hkFirstCode.put("X", 24);hkFirstCode.put("W", 23);hkFirstCode.put("O", 15);hkFirstCode.put("N", 14);}/*** 将15位身份证号码转换为18位* @param idCard* 15位身份编码* @return 18位身份编码*/public static String conver15CardTo18(String idCard) {String idCard18 = "";if (idCard.length() != CHINA_ID_MIN_LENGTH) {return null;}if (isNum(idCard)) {// 获掏诞生年月日String birthday = idCard.substring(6, 12);Date birthDate = null;try {birthDate = new SimpleDateFormat("yyMMdd").parse(birthday);} catch (ParseException e) {e.printStackTrace();}Calendar cal = Calendar.getInstance();if (birthDate != null)cal.setTime(birthDate);// 获掏诞生年(完全表现形式,如:2020)String sYear = String.valueOf(cal.get(Calendar.YEAR));idCard18 = idCard.substring(0, 6) + sYear + idCard.substring(8);// 转换字符数组char[] cArr = idCard18.toCharArray();if (cArr != null) {int[] iCard = converCharToInt(cArr);int iSum17 = getPowerSum(iCard);// 获取校验位String sVal = getCheckCode18(iSum17);if (sVal.length() > 0) {idCard18 += sVal;} else {return null;}}} else {return null;}return idCard18;}/*** 将18位身份证号码转换为15位* @param idCard* 18位身份编码* @return 15位身份编码*/public static String conver18CardTo15(String idCard) { String idCard15 = "";if (idCard.length() != CHINA_ID_MAX_LENGTH) { return null;}StringBuffer sb = new StringBuffer(idCard);sb.deleteCharAt(17);sb.deleteCharAt(7);sb.deleteCharAt(6);idCard15 = sb.toString();return idCard15;}/*** 验证身份证是不是合法*/public static boolean validateCard(String idCard) { String card = idCard.trim();if (validateIdCard18(card)) {return true;}if (validateIdCard15(card)) {return true;}String[] cardval = validateIdCard10(card);if (cardval != null) {if (cardval[2].equals("true")) {return true;}}return false;}/*** 验证18位身份编码是不是合法** @param idCard 身份编码* @return 是不是合法*/public static boolean validateIdCard18(String idCard) { boolean bTrue = false;if (idCard.length() == CHINA_ID_MAX_LENGTH) { // 前17位String code17 = idCard.substring(0, 17);// 第18位String code18 = idCard.substring(17, CHINA_ID_MAX_LENGTH);if (isNum(code17)) {char[] cArr = code17.toCharArray();if (cArr != null) {int[] iCard = converCharToInt(cArr);int iSum17 = getPowerSum(iCard);// 获取校验位String val = getCheckCode18(iSum17);if (val.length() > 0) {if (val.equalsIgnoreCase(code18)) {bTrue = true;}}}}}return bTrue;}/*** 验证15位身份编码是不是合法** @param idCard* 身份编码* @return 是不是合法*/public static boolean validateIdCard15(String idCard) {if (idCard.length() != CHINA_ID_MIN_LENGTH) {return false;}if (isNum(idCard)) {String proCode = idCard.substring(0, 2);if (cityCodes.get(proCode) == null) {return false;}String birthCode = idCard.substring(6, 12);Date birthDate = null;try {birthDate = new SimpleDateFormat("yy").parse(birthCode.substring(0, 2));} catch (ParseException e) {e.printStackTrace();}Calendar cal = Calendar.getInstance();if (birthDate != null)cal.setTime(birthDate);if (!valiDate(cal.get(Calendar.YEAR), Integer.valueOf(birthCode.substring(2, 4)),Integer.valueOf(birthCode.substring(4, 6)))) {return false;}} else {return false;}return true;}/*** 验证10位身份编码是不是合法** @param idCard 身份编码* @return 身份证信息数组* <p>* [0] - 台湾、澳门、香港[1] - 性别(男M,女F,未知N) [2] - 是不是合法(合法true,不合法false)* 假设不是身份证件号码那么返回null* </p>*/public static String[] validateIdCard10(String idCard) {String[] info = new String[3];String card = idCard.replaceAll("[\\(|\\)]", "");if (card.length() != 8 && card.length() != 9 && idCard.length() != 10) { return null;}if (idCard.matches("^[a-zA-Z][0-9]{9}$")) { // 台湾info[0] = "台湾";System.out.println("11111");String char2 = idCard.substring(1, 2);if (char2.equals("1")) {info[1] = "M";System.out.println("MMMMMMM");} else if (char2.equals("2")) {info[1] = "F";System.out.println("FFFFFFF");} else {info[1] = "N";info[2] = "false";System.out.println("NNNN");return info;}info[2] = validateTWCard(idCard) ? "true" : "false";} else if (idCard.matches("^[1|5|7][0-9]{6}\\(?[0-9A-Z]\\)?$")) { // 澳门info[0] = "澳门";info[1] = "N";// TODO} else if (idCard.matches("^[A-Z]{1,2}[0-9]{6}\\(?[0-9A]\\)?$")) { // 香港info[0] = "香港";info[1] = "N";info[2] = validateHKCard(idCard) ? "true" : "false";} else {return null;}return info;}/*** 验证台湾身份证号码** @param idCard* 身份证号码* @return 验证码是不是符合*/public static boolean validateTWCard(String idCard) {String start = idCard.substring(0, 1);String mid = idCard.substring(1, 9);String end = idCard.substring(9, 10);Integer iStart = twFirstCode.get(start);Integer sum = iStart / 10 + (iStart % 10) * 9;char[] chars = mid.toCharArray();Integer iflag = 8;for (char c : chars) {sum = sum + Integer.valueOf(c + "") * iflag;iflag--;}return (sum % 10 == 0 ? 0 : (10 - sum % 10)) == Integer.valueOf(end) ? true : false;}/*** 验证香港身份证号码(存在Bug,部份特殊身份证无法检查)* <p>* 身份证前2位为英文字符,若是只显现一个英文字符那么表示第一名是空格,对应数字58 前2位英文字符A-Z别离对应数字10-35* 最后一名校验码为0-9的数字加上字符"A","A"代表10* </p>* <p>* 将身份证号码全数转换为数字,别离对应乘9-1相加的总和,整除11那么证件号码有效* </p>** @param idCard 身份证号码* @return 验证码是不是符合*/public static boolean validateHKCard(String idCard) {String card = idCard.replaceAll("[\\(|\\)]", "");Integer sum = 0;if (card.length() == 9) {sum = (Integer.valueOf(card.substring(0, 1).toUpperCase().toCharArray()[0]) - 55) * 9+ (Integer.valueOf(card.substring(1, 2).toUpperCase().toCharArray()[0]) - 55) * 8;card = card.substring(1, 9);} else {sum = 522 + (Integer.valueOf(card.substring(0, 1).toUpperCase().toCharArray()[0]) - 55) * 8;}String mid = card.substring(1, 7);String end = card.substring(7, 8);char[] chars = mid.toCharArray();Integer iflag = 7;for (char c : chars) {sum = sum + Integer.valueOf(c + "") * iflag;iflag--;}if (end.toUpperCase().equals("A")) {sum = sum + 10;} else {sum = sum + Integer.valueOf(end);}return (sum % 11 == 0) ? true : false;}/*** 将字符数组转换成数字数组** @param ca* 字符数组* @return 数字数组*/public static int[] converCharToInt(char[] ca) {int len = ca.length;int[] iArr = new int[len];try {for (int i = 0; i < len; i++) {iArr[i] = Integer.parseInt(String.valueOf(ca[i]));}} catch (NumberFormatException e) {e.printStackTrace();}return iArr;}/*** 将身份证的每位和对应位的加权因子相乘以后,再取得和值** @param iArr* @return 身份证编码。
Java根据身份证号计算年龄,15位身份证号码转18位原理与操作示例
Java根据⾝份证号计算年龄,15位⾝份证号码转18位原理与操作⽰例本⽂实例讲述了Java根据⾝份证号计算年龄,15位⾝份证号码转18位。
分享给⼤家供⼤家参考,具体如下:第⼀代⾝份证:15位⾝份证号码的意义15位⾝份证号码各位的含义:1-2位省、⾃治区、直辖市代码;3-4位地级市、盟、⾃治州代码;5-6位县、县级市、区代码;7-12位出⽣年⽉⽇,⽐如670401代表1967年4⽉1⽇,这是和18位号码的第⼀个区别;13-15位为顺序号,其中15位男为单数,⼥为双数;与18位⾝份证号的第⼆个区别:没有最后⼀位的校验码。
举例:130503 670401 001的含义; 13为河北,05为邢台,03为桥西区,出⽣⽇期为1967年4⽉1⽇,顺序号为001第⼆代⾝份证:18位⾝份证号码的意义 ①前1、2位数字表⽰:所在省份的代码,河南的省份代码是41哦! ②第3、4位数字表⽰:所在城市的代码; ③第5、6位数字表⽰:所在区县的代码; ④第7~14位数字表⽰:出⽣年、⽉、⽇; ⑤第15、16位数字表⽰:所在地的派出所的代码; ⑥第17位数字表⽰性别:奇数表⽰男性,偶数表⽰⼥性; ⑦第18位数字是校检码:也有的说是个⼈信息码,⼀般是随计算机随机产⽣,⽤来检验⾝份证的正确性。
校检码可以是0~9的数字,有时也⽤x表⽰。
举例:130503 19670401 0012这个⾝份证号的含义: 13为河北,05为邢台,03为桥西区,出⽣⽇期为1967年4⽉1⽇,顺序号为001,2为校验码。
根据⾝份证号(18位)提取出⽣年⽉⽇和计算年龄package idcard;import java.text.SimpleDateFormat;import java.util.Date;public class IdCardTest {//根据⾝份证号输出年龄public static int IdNOToAge(String IdNO){int leh = IdNO.length();String dates="";int age = 0;if (leh == 18) {dates = IdNO.substring(6, 10);SimpleDateFormat df = new SimpleDateFormat("yyyy");String year = df.format(new Date());age = Integer.parseInt(year)-Integer.parseInt(dates);}else {System.out.println("出错!⾝份证长度不是18位!");}return age;}public static void main(String[] args) {System.out.println(IdNOToAge("120000************"));System.out.println(IdNOToAge("320000************"));}}15位⾝份证号码转换成18位⾝份证号码package idcard;import java.util.Scanner;public class IDcard15bitTo18bit {public static String[] trans15bitTo18bit(String[] input){String[] result = new String[18];for(int i=0;i<input.length;i++){if(i<=5){result[i] = input[i];}else{result[i+2] = input[i];}}//年份最后两位⼩于17,年份为20XX,否则为19XXif(Integer.valueOf(input[6])<=1&&Integer.valueOf(input[7])<=7){result[6]="2";result[7]="0";}else{result[6]="1";result[7]="9";}//计算最后⼀位String[] xs = {"7","9","10","5","8","4","2","1","6","3","7","9","10","5","8","4","2"}; //前⼗七位乘以系数[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2],int sum = 0;for(int i=0;i<17;i++){sum+= Integer.valueOf(result[i]) * Integer.valueOf(xs[i]);}//对11求余,的余数 0 - 10int rod = sum % 11;//所得余数映射到对应数字即可if(rod==0){ result[17] = "1";}else if(rod==1){ result[17] = "0";}else if(rod==2){ result[17] = "X";}else if(rod==3){ result[17] = "9";}else if(rod==4){ result[17] = "8";}else if(rod==5){ result[17] = "7";}else if(rod==6){ result[17] = "6";}else if(rod==7){ result[17] = "5";}else if(rod==8){ result[17] = "4";}else if(rod==9){ result[17] = "3";}else if(rod==10){ result[17] = "2";}return result;}public static void main(String[] args) {//创建输⼊对象Scanner sc=new Scanner(System.in);//获取⽤户输⼊的字符串String str="";System.out.print("请输⼊您的15位⾝份证号:");str=sc.nextLine();System.out.println("您输⼊的15位⾝份证号为:"+str);if(str.length()==15){String[] input = str.split("");String[] result = trans15bitTo18bit(input);System.out.print("您的18位⾝份证号是:");for(String c:result){System.out.print(c);}}else{System.out.println("不符合格式的⾝份证号!");}}}附:C# 版与VB 版 15位的⾝份证号转为18位操作⽰例C# 版function ID15T18(strTemp){var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');var nTemp = 0, i;if(strTemp.length==15){strTemp = strTemp.substr(0,6) + '19' + strTemp.substr(6,strTemp.length-6);for(i = 0; i < strTemp.length; i ++){nTemp += strTemp.substr(i, 1) * arrInt[i];}strTemp += arrCh[nTemp % 11];}return strTemp;}VB 版privatestringConvert15To18(stringstrTemp){int[]arrInt=newint[]{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};stringarrCh="10X98765432";intnTemp=0;if(strTemp.Length==15){strTemp=strTemp.Substring(0,6)+"19"+strTemp.Substring(6,strTemp.Length-6);for(inti=0;i<strTemp.Length;i++){nTemp+=int.Parse(strTemp.Substring(i,1).ToString())*arrInt[i];}strTemp+=arrCh[nTemp%11];}chardd=arrCh[nTemp%11];returnstrTemp;}PS:这⾥再提供⼀款本站⾝份证归属地信息查询⼯具供⼤家参考:另外,本站在线⼯具⼩程序上也有⼀款功能更加强⼤的⾝份证信息获取⼯具,感兴趣的朋友可以扫描如下⼩程序码查看:更多关于java相关内容感兴趣的读者可查看本站专题:《》、《》、《》和《》希望本⽂所述对⼤家java程序设计有所帮助。
15位身份证升级为18位 并查询其信息
--15位身份证升级为18位并查询其信息create or replace procedure f_changecard(p_cert_num in varchar2)asv_cert_num varchar2(30);v_type varchar2(20);v_sum varchar2(10);--v_sum_m varchar2(10);v_yu varchar2(4);v_new varchar(30);v_nian varchar(4);v_yue varchar(4);v_ri varchar(4);v_sex varchar2(2);v_sf varchar2(10);v_sf_f varchar2(4);--v_yu_y varchar2(4);beginexecute immediate'select length(:p_cert_num) from dual'into v_typeusing p_cert_num;execute immediate'select (select substr((select :p_cert_num from dual),1,6) from dual )||19||(select substr((select :p_cert_num from dual),7,9) from dual) from dual'into v_cert_numusing p_cert_num,p_cert_num;--判断身份证是否为15位if v_type<>15then dbms_output.put_line('请输入证件号为15位的身份证信息');else--校验取余v_sum:=substr(v_cert_num,1,1)*7+substr(v_cert_num,2,1)*9+substr(v_cert_num,3,1)*10+substr(v_cert_num,4,1)*5+substr(v_cert_num,5,1)*8+substr(v_cert_num,6,1)*4+substr(v_cert_num,7,1)*2+substr(v_cert_num,8,1)*1+substr(v_cert_num,9,1)*6+substr(v_cert_num,10,1)*3+substr(v_cert_num,11,1)*7+substr(v_cert_num,12,1)*9+substr(v_cert_num,13,1)*10+substr(v_cert_num,14,1)*5+substr(v_cert_num,15,1)*8+substr(v_cert_num,16,1)*4+substr(v_cert_num,17,1)*2;--取出生年月v_nian:=substr(v_cert_num,7,4);v_yue:=substr(v_cert_num,11,2);v_ri:=substr(v_cert_num,13,2);--取性别v_sex:=substr(v_cert_num,17,1);--取地区v_sf:=substr(v_cert_num,1,6);v_sf_f:=substr(v_cert_num,1,2);--7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2v_yu:=mod(v_sum,11);--0 1 2 3 4 5 6 7 8 9 10,1 0 X 9 8 7 6 5 4 3 2 --得出新18位证件号if v_yu=0then v_new:=v_cert_num||'1';elsif v_yu=1then v_new:=v_cert_num||'0';elsif v_yu=2then v_new:=v_cert_num||'X';elsif v_yu=3then v_new:=v_cert_num||'9';elsif v_yu=4then v_new:=v_cert_num||'8';elsif v_yu=5then v_new:=v_cert_num||'7';elsif v_yu=6then v_new:=v_cert_num||'6';elsif v_yu=7then v_new:=v_cert_num||'5';elsif v_yu=8then v_new:=v_cert_num||'4';elsif v_yu=9then v_new:=v_cert_num||'3';elsif v_yu=10then v_new:=v_cert_num||'2';end if;--判断新产生的18位身份证号码真伪依据月份日期判断只能。
EXCEL中批量将15位身份证号码变更为18位身份证号码
EXCEL中批量将15位身份证号码变更为18位身份证号码一、假设15位号码在C列,在D列中输入数组公式(公式输入后须同时按下Ctrl+Shift+Enter组合键方可完成):=IF(LEN(D6)=15,REPLACE(D6,7,,19)&MID("10X98765432",MOD(SUM(MID( REPLACE(D6,7,,19),ROW(INDIRECT("1:17")),1)*2^(18-ROW(INDIRECT("1 :17")))),11)+1,1),D6)二、15位的老身份证号码插入年份即可升到17位,假设15位号码在C 列,在D列输入公式=IF(LEN(C6)=15,MID(C6,1,6)&"19"&MID(C6,7,9))就可以在年份前添加19。
假设17位号码在C列,在D列中输入数组公式(公式输入后须同时按下Ctrl+Shift+Enter组合键方可完成):=C6&LOOKUP(MOD(SUM(MID(C6,ROW($1:$17),1)*MOD(2^(18-ROW($1:$17)) ,11)),11),{0,1,2,3,4,5,6,7,8,9,10},{1,0,"X",9,8,7,6,5,4,3,2})即可得到18位(上述公式为函数大师陈军的作品)。
参考资料:公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。
排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
校验方法:(1)十七位数字本体码加权求和公式S = Sum(A i * Wi), i = 0, … , 16 ,先对前17位数字的权求和Ai:表示第i位置上的身份证号码数字值Wi:表示第i位置上的加权因子Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 (2)计算模Y = mod(S, 11)(3)通过模得到对应的校验码Y: 0 1 2 3 4 5 6 7 8 9 10校验码: 1 0 X 9 8 7 6 5 4 3 2。
身份证号码批量15位转18位
#VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE!
#VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE!
18位身份证和组织机构代码校验ORACLE函数
18位身份证和组织机构代码校验ORACLE函数第一篇:18位身份证和组织机构代码校验ORACLE函数18位身份证和组织机构代码校验ORACLE函数18位身份证和组织机构代码校验ORACLE函数18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确规定。
GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称“社会保障号码”更名为“公民身份号码”,另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。
公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。
排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。
其含义如下:1.地址码:表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
2.出生日期码:表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日分别用4位、2位、2位数字表示,之间不用分隔符。
3.顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
校验的计算方式:1.对前17位数字本体码加权求和公式为:S = Sum(Ai * Wi), i = 0,..., 16其中Ai表示第i位置上的身份证号码数字值,Wi表示第i位置上的加权因子,其各位对应的值依次为: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 22.以11对计算结果取模Y = mod(S, 11)3.根据模的值得到对应的校验码对应关系为:Y值: 0 1 2 3 4 5 6 7 8 9 10校验码: 1 0 X 9 8 7 6 5 4 3 215位的身份证号dddddd yymmdd xx p18位的身份证号dddddd yyyymmdd xx p y其中dddddd为地址码(省地县三级)18位中的和15位中的不完全相同 yyyymmdd yymmdd 为出生年月日 xx顺号类编码 p性别18位中末尾的y为校验码,在网上可以找到算法(1)、前两个数字代表省份编码。
oracle关于15位身份证转换18位身份证函数
create table dw11 (sfz varchar2(18)); insert into dw11 values ('320122880110323');
select IDCARD15Leabharlann O18(sfz) from dw11;
update dw11 set sfz=IDCARD15TO18(sfz);
Begin If CARD Is Null Then Return ''; End If; If LENGTH(CARD) <> 15 Then Return CARD; End If; 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'); RESULTS := SUBSTR(CARD, 1, 6) || '19' || SUBSTR(CARD, 7, 9); S := 0; Begin For I In 1 .. 17 Loop S := S + To_Number(SUBSTR(RESULTS, I, 1)) * W(I); End Loop; Exception When Others Then Return ''; End; S := S Mod 11; RESULTS := RESULTS || A(S + 1); Return(RESULTS);
巧用SQL语句解决身份证号15位批量升级18位问题
巧用SQL语句解决身份证号15位批量升级18位问题
巧用SQL语句解决身份证号15位批量升级18位问题
作者:陈剑芳;
作者机构:福建省莆田市城厢区审计局;
来源:现代审计与会计
ISSN:1007-8258
年:2018
卷:000
期:008
页码:P.30-33
页数:4
中图分类:F239.45
正文语种:CHI
关键词:身份证号码;升位;方法
摘要:当前各类信息系统中存在大量身份证号码用15位老号登记的现象,直接影响了信息系统的建设运行,同时也使审计机关运用计算机审计所能获得的成果难以达到预期的最佳效果。
审计人员创新审计方法,撰写了身份证号码自动升位SQL语句,便于解决各信息系统之间由于新旧身份证号码不一致导致的关联与比对难题.审计人员借此可以最大限度反映被审计单位存在问题的真实情况。
提升审计成果。
用PB和ORACLE方法实现身份证号升位
用PB和ORACLE方法实现身份证号升位
陆波
【期刊名称】《信息技术》
【年(卷),期】2003(027)006
【摘要】在对人员的管理工作中,需经常使用姓名和身份证号来进行人员检索.身份证号所具有的唯一性,决定了它成为表征一个人信息的准确特征.原有的15位身份证号存在着"2000年"问题,需升至18位.本文分别用PB和ORACLE两种语言方式,讲述了实现身份证号升位的方法.
【总页数】2页(P98-99)
【作者】陆波
【作者单位】哈尔滨市社会保险事业管理局,哈尔滨,150010
【正文语种】中文
【中图分类】TP312;OR;TP312;PB
【相关文献】
1.在PB9.0和Oracle 9i中实现多媒体数据操作的方法 [J], 文锋;姚力文;段隆振;林振荣
2.利用PB实现DBF文件到Oracle基表的数据转换 [J], 魏远旺;段隆振;黄龙军
3.用VB.NET实现身份证号码升位算法 [J], 林立云
4.在VFP6.0中实现身份证号码的升位 [J], 何健雄;黎银环
5.关于PB在SQLSERVER与ORACLE数据库间数据比对的实现 [J], 韩海泳
因版权原因,仅展示原文概要,查看原文内容请购买。
身份证15位至18位转换的C函数设计与实现
身份证15位至18位转换的C函数设计与实现
吴兆福
【期刊名称】《智能计算机与应用》
【年(卷),期】2006(000)005
【摘要】介绍了18位身份证的组成,根据GB11643-1999标准的规定和ISO 7064:1983.MOD11-2校验码算法,实现了15位到18位的C转换函数设计与实现.【总页数】2页(P60-61)
【作者】吴兆福
【作者单位】湖北省荆州职业技术学院信息技术系,434101
【正文语种】中文
【中图分类】TP311.1
【相关文献】
1.基于VBA实现身份证由15位到18位转换 [J], 刘韶华
2.在Oracle中用Java实现身份证转换 [J], 孙璐
3.身份证15位至18位转换的C函数设计与实现 [J], 杜成龙;吴兆福
4.移动ID将手机转换为联网身份证 [J], 俞庆华
5.移动ID将手机转换为联网身份证 [J],
因版权原因,仅展示原文概要,查看原文内容请购买。