您的位置:首页 > 数据库

SQL 获得某表中身份证信息有效的数据

2015-01-15 13:21 260 查看
参考文章:中华人民共和国居民身份证【http://zh.wikipedia.org/wiki/%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD%E5%B1%85%E6%B0%91%E8%BA%AB%E4%BB%BD%E8%AF%81#.E6.A0.A1.E9.AA.8C.E7.A0.81.E8.AE.A1.E7.AE.97.E6.96.B9.E6.B3.95】
--18位的:
SELECT*
FROMCustomer
WHEREIDCardISNOTNULLANDLEN(IDCard)=18--长度限制
ANDIsnumeric(Substring(IDCard,1,17))=1ANDPATINDEX('%.%',Substring(IDCard,1,17))=0--前17位是整数
ANDISDATE(Substring(IDCard,7,4)+'-'+Substring(IDCard,11,2)+'-'+Substring(IDCard,13,2))=1--第8~14位可以构成日期类型
ANDSubstring(IDCard,7,4)+'-'+Substring(IDCard,11,2)+'-'+Substring(IDCard,13,2)BETWEEN'1900-01-01'AND'2079-06-06'--日期时间在‘1900-01-01’~‘2079-06-06’之间
ANDsubstring(IDCard,18,1)=dbo.GetCheckIDCardCode(IDCard)--最后一位是否正确

--15位的:
SELECT*FROMCustomer
WHEREIDCardISNOTNULLANDLEN(IDCard)=15--长度限制
ANDISNUMERIC(IDCard)=1ANDPATINDEX('%.%',IDCard)=0--是整数
ANDISDATE('19'+SUBSTRING(IDCard,7,2)+'-'+SUBSTRING(IDCard,9,2)+'-'+SUBSTRING(IDCard,11,2))=1--第8~12位可以构成日期类型
AND'19'+SBUSTRING(IDCard,7,2)+'-'+SUBSTRING(IDCard,9,2)+'-'+SUBSTRING(IDCard,11,2)BETWEEN'1900-01-01'AND'2079-06-06'--日期时间在‘1900-01-01’~‘2079-06-06’之间

/*
ISNUMERIC:当输入运算式为有效数值类型(int,bigint,smallint,tinyint,decimal)时,ISNUMERIC就会传回1,否则便传回0。
PATINDEX:返回在指定表达式中第一次出现的起始位置;如果在所有有效的文本和字符数据类型中都找不到该模式,则返回0。
ISDATE:如果expression是有效的date、time或datetime值,则返回1;否则,返回0。(如果expression为datetime2值,则ISDATE返回0)
*/

其中跟据国家规定的计算公式,计算18位身份证最后一位的dbo.GetCheckIDCardCode如下:


CREATEFUNCTIONGetCheckIDCardCode(@sfzhCHAR(18))
RETURNSCHAR(1)
AS
BEGIN
DECLARE@rVARCHAR(2)
DECLARE@iINT
IFLEN(@sfzh)<>18
SET@r=0
ELSE
SET@i=CAST(SUBSTRING(@sfzh,1,1)ASINT)*7
+CAST(SUBSTRING(@sfzh,2,1)ASINT)*9
+CAST(SUBSTRING(@sfzh,3,1)ASINT)*10
+CAST(SUBSTRING(@sfzh,4,1)ASINT)*5
+CAST(SUBSTRING(@sfzh,5,1)ASINT)*8
+CAST(SUBSTRING(@sfzh,6,1)ASINT)*4
+CAST(SUBSTRING(@sfzh,7,1)ASINT)*2
+CAST(SUBSTRING(@sfzh,8,1)ASINT)*1
+CAST(SUBSTRING(@sfzh,9,1)ASINT)*6
+CAST(SUBSTRING(@sfzh,10,1)ASINT)*3
+CAST(SUBSTRING(@sfzh,11,1)ASINT)*7
+CAST(SUBSTRING(@sfzh,12,1)ASINT)*9
+CAST(SUBSTRING(@sfzh,13,1)ASINT)*10
+CAST(SUBSTRING(@sfzh,14,1)ASINT)*5
+CAST(SUBSTRING(@sfzh,15,1)ASINT)*8
+CAST(SUBSTRING(@sfzh,16,1)ASINT)*4
+CAST(SUBSTRING(@sfzh,17,1)ASINT)*2
SET@i=@i-@i/11*11
SET@r=CAST((CASE@i
WHEN0THEN1
WHEN1THEN0
WHEN2THEN11
WHEN3THEN9
WHEN4THEN8
WHEN5THEN7
WHEN6THEN6
WHEN7THEN5
WHEN8THEN4
WHEN9THEN3
WHEN10THEN2
ELSE''END)ASCHAR)

IF(@r=11)SET@r='X'
ELSESET@r=@r

SET@r=''+@r+''
RETURN@r
END





                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: