写了个15位身份证号升级为18位的SQL语句
-- 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')
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
[解决办法]
呵呵, 之前用C#写过一个...
支持...
[解决办法]
收到顶!
接分~~!
[解决办法]
厉害,顶一个
[解决办法]
不錯
[解决办法]
支持楼主
[解决办法]
算了...少接一点分了...顺路在膜拜一下楼主。。
[解决办法]
学习了...
[解决办法]
Mark
[解决办法]
这个不错,有用处,收藏.
[解决办法]
en,不错!
[解决办法]
收藏&&学习
[解决办法]
楼主好人,顶一个
[解决办法]
好东西!!!收藏!
[解决办法]
--呵呵,修改了下 ,做了个存储过程
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
[解决办法]
好东东 顶一下先
[解决办法]
谢谢分享!收藏。
[解决办法]
大牛
------解决方案--------------------
收藏
[解决办法]
mark
[解决办法]
顶
[解决办法]
up
收藏了
[解决办法]
收藏,学习!
[解决办法]
强!
[解决办法]
SQL code-- 15位身份证号升级为18位,适用于18xx年出生的公民
哪位是18xx年出生的公民?^_^
[解决办法]
.....
[解决办法]
收下
[解决办法]
18xx年出生的公民?都死绝了吧。。。。。
[解决办法]
挺强的,谢谢各位了,如果不是各位,还真不知道身份证的规律。
[解决办法]
顶
[解决办法]
菜鸟刚学c#
试着写写,希望老鸟不要笑话。
只适合19XX年的,18XX年的这个估计……20XX年的都自动18位了吧。
using System;namespace CardNumber{ class Class1 { [STAThread] static void Main(string[] args) { test:Console.Write("Please Input 15 bits CardNumber:"); string tempSource=Convert.ToString(Console.ReadLine()); if(tempSource.Length!=15) { Console.WriteLine("Please Inputtthe Correct Number!"); goto test; } try { string temp=tempSource.Substring(0,6)+"19"+tempSource.Substring(6,9); int sum=0; int[] Wi=new int[17]{7,9,10,5,8,4,2,1,6,3,7,9,10,5,4,8,2}; string[] CheckCode=new string[11]{"1","0","X","9","8","7","6","5","4","3","2"}; for(int i=0;i<17;i++) { sum+=Convert.ToInt32(temp.Substring(i,1))*Wi[i]; } for(int j=0;j<11;j++) { if((sum%11)==j) { Console.WriteLine("Update CardNumber is :{0}",temp+CheckCode[j]); } } Console.Write("Are You Go On?(y/n)"); if(Console.ReadLine().Trim().ToUpper().ToString()=="Y") { goto test; } } catch { Console.WriteLine("Error! Please Input the Correct Number!"); goto test; } } }}