首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

写了个15位身份证号升级为18位的SQL语句,该怎么解决

2012-04-03 
写了个15位身份证号升级为18位的SQL语句SQL code-- 15位身份证号升级为18位,适用于18xx年出生的公民UPDATE

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

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')


[解决办法]
up
[解决办法]

[解决办法]
收下了,支持
[解决办法]
up
[解决办法]
牛人啊,支持
[解决办法]
:):)
[解决办法]
支持,大家顶起来哈
[解决办法]
up~,学习
[解决办法]
最后一位有规律?
[解决办法]
mark ,JF
[解决办法]
这个是什么规律呀?
-----------------

乘的那个系数是这样来的:

按位,
2^17%11=7 2^16%11=9 2^15%11=10 2^14%11=5 2^13%11=8 2^12%11=4 2^11%11=2 2^15%01=1 2^9%11=6 2^8%11=3 2^7%11=7 2^6%11=9 2^5%01=10 2^4%11=5 2^3%11=8 2^2%11=4 2^1%11=2 

[解决办法]
学习
[解决办法]
支持楼主
[解决办法]
UP
[解决办法]
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 


[解决办法]
呵呵, 之前用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位了吧。

C# code
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;            }        }    }} 

热点排行