一、身份证号码的组成规则
(1)第1、2位数字表示:所在省份的代码;
(2)第3、4位数字表示:所在城市的代码;
(3)第5、6位数字表示:所在区县的代码;
(4)第7、8、9、10位代表出生年;
(5)第11位、12位表示:出生月;
(6)第13位、14位表示:出生日;
(7)第15、16位表示:同年同月同日同地区出生的顺序;
(8)第17位表示性别:奇数表示男性,偶数表示女性;
(9)第18位数字是校检码:0-9 X;
二、使用hql进行身份证号码的校验
select * from
(select trim(upper(id)) idcard from id_info) t1
where
-- 1. 身份证号码位数不正确
length(idcard) <> 18
-- 2. 省份代码不正确
or substr(idcard,1,2) not in ('11','12','13','14','15','21','22','23','31','32','33','34','35','36','37','41','42',
'43','44','45','46','50','51','52','53','54','61','62','63','64','65','71','81','82','91')
-- 3. 身份证号码的正则表达式判断,注意hql中if的写法是if(expression, T result1, T result2)
or (
-- 如果为闰年,则执行4中的正则表达式,如果为平年则执行5中的正则表达式
if(pmod(cast(substr(idcard, 7, 4) as int),400) = 0 or (pmod