Lotus教程、Java教程、Java虚拟机、Java软件综合开发社区

Lotus、Domino、Java、C#、Web、数据库综合开发教程、资料社区

写了个15位身份证号升级为18位的SQL语句



Published by admin on 08月 30, 2008
SQL code
 15位身份证号升级为18位,适用于18xx年出生的公民 UPDATE 员工表 SET 身份证号=   SUBSTRING(身份证号,1,6)+18+SUBSTRING(身份证号,7,9)+  
 SUBSTRING(10X98765432,   (    CAST(SUBSTRING(身份证号, 1,1) AS INT)*7   +CAST(SUBSTRING(身份证号, 2,1) AS INT)*9   +
CAST(SUBSTRING(身份证号, 3,1) AS INT)*10   +CAST(SUBSTRING(身份证号, 4,1) AS INT)*5   +CAST(SUBSTRING(身份证号, 5,1) AS INT)*8   +
CAST(SUBSTRING(身份证号, 6,1) AS INT)*4   +1*2   +8*1   +CAST(SUBSTRING(身份证号, 7,1) AS INT)*6   +
CAST(SUBSTRING(身份证号, 8,1) AS INT)*3   +CAST(SUBSTRING(身份证号, 9,1) AS INT)*7   +CAST(SUBSTRING(身份证号,10,1) AS INT)*9   +
CAST(SUBSTRING(身份证号,11,1) AS INT)*10   +CAST(SUBSTRING(身份证号,12,1) AS INT)*5   +CAST(SUBSTRING(身份证号,13,1) AS INT)*8   +
CAST(SUBSTRING(身份证号,14,1) AS INT)*4   +CAST(SUBSTRING(身份证号,15,1) AS INT)*2   )   % 11 + 1, 1) WHERE LEN(身份证号)=15 AND SUBSTRING(身份证号,13,3) IN (999,998,997,996)  
 15位身份证号升级为18位,适用于19xx年出生的公民 UPDATE 员工表 SET 身份证号=   SUBSTRING(身份证号,1,6)+19+SUBSTRING(身份证号,7,9)+   
SUBSTRING(10X98765432,   (    CAST(SUBSTRING(身份证号, 1,1) AS INT)*7   +CAST(SUBSTRING(身份证号, 2,1) AS INT)*9   
+CAST(SUBSTRING(身份证号, 3,1) AS INT)*10   +CAST(SUBSTRING(身份证号, 4,1) AS INT)*5  
 +CAST(SUBSTRING(身份证号, 5,1) AS INT)*8   +CAST(SUBSTRING(身份证号, 6,1) AS INT)*4   
+1*2   +9*1   +CAST(SUBSTRING(身份证号, 7,1) AS INT)*6   +CAST(SUBSTRING(身份证号, 8,1) AS INT)*3  
 +CAST(SUBSTRING(身份证号, 9,1) AS INT)*7   +CAST(SUBSTRING(身份证号,10,1) AS INT)*9  
 +CAST(SUBSTRING(身份证号,11,1) AS INT)*10   +CAST(SUBSTRING(身份证号,12,1) AS INT)*5   +CAST(SUBSTRING(身份证号,13,1) AS INT)*8   +CAST(SUBSTRING(身份证号,14,1) AS INT)*4   +CAST(SUBSTRING(身份证号,15,1) AS INT)*2   )   % 11 + 1, 1) WHERE LEN(身份证号)=15 AND SUBSTRING(身份证号,13,3) NOT IN (999,998,997,996)
  
HTML code
18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确的规定。 
GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称”社会保障号码”更名为”公民身份号码”,
另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。GB11643-1999《公民身份号码》主要内容如下:
 一、范围      该标准规定了公民身份号码的编码对象、号码的结构和表现形式,使每个编码对象获得一个唯一的、不变的法定号码。 
二、编码对象      公民身份号码的编码对象是具有中华人民共和国国籍的公民。
 三、号码的结构和表示形式 
 1、号码的结构     公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
 2、地址码     表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
 3、出生日期码     表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。 
4、顺序码      表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
 5、校验码 (1)十七位数字本体码加权求和公式 S = Sum(Ai * 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 四、举例如下: 北京市朝阳区: 11010519491231002X 广东省汕头市: 440524188001010014




<><>


<>

<><>




<><>



<><>


<><>




<><>



<><>



<>
发表于:2007-12-10 11:41:1932楼 得分:0
–呵呵,修改了下   ,做了个存储过程    CREATE   PROCEDURE   身份证转18位 @身份证号   nvarchar(20)   OUTPUT, @时间分界   int   –18   为   18xx年,   19为19xx年,   20为20xx年 AS —存在问题   10000年以后无法处理,哈哈一万年了。估计是否还用这个规则处理出生年月啊。 —-估计需要转到20位身份证号码了。。。。declare   @ERR_CODE   as   smallint   ,   –0成功那个转换     -1   年时区间错   ,-2身份证号码不是15位   @年限   smallint, ——这个是为了便于修改添加的了 @年首位   smallint, @年次位   smallint ——–@年三位 smallint     这个估计用不上了。 SET   @年限=2   –这里只处理2位好了。 SET   @ERR_CODE= CASE WHEN   LEN(@身份证号) <> 15   THEN   -2 WHEN   (@时间分界 <10)   OR   (@时间分界> 99)   THEN   -1 END IF   @ERR_CODE <> 0 BEGIN     RETURN     @ERR_CODE   —说了不能处理,还要给我来硬的啊! END SET   @年首位   =CAST(SUBSTRING(CAST(@时间分界   as   nvarchar(2)),1,1)   as   smallint) SET   @年次位 =CAST(SUBSTRING(CAST(@时间分界   as   nvarchar(2)),2,1)   as   smallint) IF   (SUBSTRING(@身份证号,13,3)   NOT   IN   (’999′,’998′,’997′,’996′)) BEGIN   set   @身份证号=     SUBSTRING(@身份证号,1,6)+CAST(@时间分界   as   nvarchar(2))+SUBSTRING(@身份证号,7,9)+     SUBSTRING(’10X98765432′,     (       CAST(SUBSTRING(@身份证号,   1,1)   AS   INT)*7     +CAST(SUBSTRING(@身份证号,   2,1)   AS   INT)*9     +CAST(SUBSTRING(@身份证号,   3,1)   AS   INT)*10     +CAST(SUBSTRING(@身份证号,   4,1)   AS   INT)*5     +CAST(SUBSTRING(@身份证号,   5,1)   AS   INT)*8     +CAST(SUBSTRING(@身份证号,   6,1)   AS   INT)*4     +@年首位*2     +@年次位*1     +CAST(SUBSTRING(@身份证号,   7,1)   AS   INT)*6     +CAST(SUBSTRING(@身份证号,   8,1)   AS   INT)*3     +CAST(SUBSTRING(@身份证号,   9,1)   AS   INT)*7     +CAST(SUBSTRING(@身份证号,10,1)   AS   INT)*9     +CAST(SUBSTRING(@身份证号,11,1)   AS   INT)*10     +CAST(SUBSTRING(@身份证号,12,1)   AS   INT)*5     +CAST(SUBSTRING(@身份证号,13,1)   AS   INT)*8     +CAST(SUBSTRING(@身份证号,14,1)   AS   INT)*4     +CAST(SUBSTRING(@身份证号,15,1)   AS   INT)*2     )     %   11   +   1,   1) END –SELECT   @身份证号 —验证测试代码如下: declare   @时间分界   int, @身份证号   nvarchar(20), @iReturn   int set   @时间分界=19 set   @身份证号=’110105491231002′ select   @时间分界   ,@身份证号 exec   @iReturn=身份证转18位   @身份证号   output,@时间分界 select   @时间分界   ,@身份证号,@iReturn
 


【版权说明】:本网页上有部分内容来源于网上收集,但不能保证资料的完整性和准确性,仅提供参考和学习。如有侵权请立即通知我们,我们将立即删除,谢谢合作!

Add A Comment