身份证验证函数
身份证号码的规则是:
15位:[6位行政区划号码] + [2位年份] + [2位月份] + [2位日期] + [3位随机数]
18位:[6位行政区划号码] + [4位年份] + [2位月份] + [2位日期] + [3位随机数] + [1位识别码]
其中18位身份证号码可以通过计划识别码的方式,验证身份证号码是否正确.具体算法可以问下google in china或baidu,也可以从下面的代码中分析出来.
从身份证号码可以,还可以识别出持有者的一些基本信息,比如:
出生地: 前面6位代表的是行政区划号码,通过它可以出现具体到县的行政区,具体号码代表的行政区,可以查看国家统计局行政区代码.
出生日期: 15位: 7,8位为年份 9,10位为月份 11,12位为日期
18位:7到10位为年份 11到12为月份 13到14位为日期
性别: 倒数第2位,单数为男性,偶数为女性
CREATE FUNCTION funIDCradValid
(
@idc varchar(18)
)
RETURNS BIT
AS
BEGIN
--身份证号只有15或18位
IF LEN(@idc)<>15 AND LEN(@idc)<>18 RETURN(0)
--如果是15位身份证 则只验证日期和是否数字格式
IF LEN(@idc)=15
IF ISDATE('19'+SUBSTRING(@idc,7,6))=0 OR ISNUMERIC(@idc)=0
RETURN(0)
ELSE
RETURN(1)
--18位身份证 验证日期 校验位
--验证日期和前17位是否数字格式
IF ISDATE(SUBSTRING(@idc,7,8))=0 OR ISNUMERIC(SUBSTRING(@idc,1,17))=0 RETURN(0)
--验证校验位开始
DECLARE @validFactors VARCHAR(17),@validCodes VARCHAR(11),@i TINYINT,@iTemp INT
SELECT @validFactors='79A584216379A5842',@validCodes='10X98765432',@i=1,@iTemp=0
WHILE @i<18
BEGIN
SELECT @iTemp=@iTemp+CAST(SUBSTRING(@idc,@i,1) AS INT)*(CASE SUBSTRING(@validFactors,@i,1) WHEN 'A' THEN 10 ELSE SUBSTRING(@validFactors,@i,1) END)
,@i=@i+1
END
IF SUBSTRING(@validCodes,@iTemp%11+1,1)=RIGHT(@idc,1) RETURN 1
RETURN 0
END
当函数返回为0时,代表不是合法的身份证号码,为1代表身份证号码合法.
Tag标签: SQL
- 1. 疑难杂症之分页问题2010-04-05
- 2. 身份证验证函数2010-04-04
- 3. 数据库主体在该数据库中拥有 架构,无法删除解决方法2010-02-03
- 4. 获得数据库的排它访问权2010-01-27
- 5. sp_MSForEachTable和sp_MSForEachDB的使用方法2009-08-03
- 6. 取数据库所有表的记录数2009-06-19
- 7. SQL语句优化建议2009-05-13
- 8. 得到字段相关的约束信息2008-11-24





