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
相关文章推荐
- 获得Sql 数据表的详细信息
- 获得所有表信息的SQL语句
- 通过身份证号获得想要的信息
- sql存储过程+游标 根据身份证号码获得生日
- 6.5 分页列表详细信息标签预编译sql获取数据功能
- SQL语句获取数据表名,字段等信息
- SQL点滴4—筛选数据列的类型,字段大小,是否可为空,是否是主键,约束等等信息
- SQL语句获得本年日期数据与本月日期数据
- getSQLinfo.vbs 获得SQL数据/日志空间使用情况的脚本
- sql 错误信息:消息 402 数据类型 ntext 和 ntext 在 equal to 运算符中不兼容
- [转]用sql获得Oracle数据库版本信息
- 步步为营VS 2008 + .NET 3.5(13) - DLINQ(LINQ to SQL)之用户自定义函数、在不同的DataContext之间做更新、缓存、获取信息、数据加载选项和延迟加载
- 步步为营VS 2008 + .NET 3.5(13) - DLINQ(LINQ to SQL)之用户自定义函数、在不同的DataContext之间做更新、缓存、获取信息、数据加载选项和延迟加载
- 查找SQL数据表或视图中的字段属性信息
- 异常详细信息: System.Data.SqlClient.SqlException: 将截断字符串或二进制数据。
- sql利用sp_columns_rowset 获得详细的表格信息
- Oracle中如何获得数据库服务器的时区信息?(PL/SQL)
- access2007下获得上个月的全部数据的sql语句
- sql server 查询表信息,字段,数据类型的sql语句
- SQL查询有关 sql_variant 值的基本数据类型和其他信息