set @identityno='53010219200508011x';
select
case when substr(@identityno, 7, 4) not between '1900' and '2022' then '身份证年份校验不通过'
when substr(@identityno, 11, 2) not between '01' and '12' then '身份证月份校验不通过'
when substr(@identityno, 13, 2) not between '01' and '31' then '身份证日期校验不通过'
when mod(
(
substr(@identityno, 1, 1) * 7 + substr(@identityno, 2, 1) * 9 + substr(@identityno, 3, 1) * 10 + substr(@identityno, 4, 1) * 5 + substr(@identityno, 5, 1) * 8 + substr(@identityno, 6, 1) * 4 + substr(@identityno, 7, 1) * 2 + substr(@identityno, 8, 1) * 1 + substr(@identityno, 9, 1) * 6 + substr(@identityno, 10, 1) * 3 + substr(@identityno, 11, 1) * 7 + substr(@identityno, 12, 1) * 9 + substr(@identityno, 13, 1) * 10 + substr(@identityno, 14, 1) * 5 + substr(@identityno, 15, 1) * 8 + substr(@identityno, 16, 1) * 4 + substr(@identityno, 17, 1) * 2
),
11
) <> (
case
when substr(@identityno, 18, 1) = '1' then '0'
when substr(@identityno, 18, 1) = '0' then '1'
when substr(@identityno, 18, 1) in ('X', 'x') then '2'
when substr(@identityno, 18, 1) = '9' then '3'
when substr(@identityno, 18, 1) = '8' then '4'
when substr(@identityno, 18, 1) = '7' then '5'
when substr(@identityno, 18, 1) = '6' then '6'
when substr(@identityno, 18, 1) = '5' then '7'
when substr(@identityno, 18, 1) = '4' then '8'
when substr(@identityno, 18, 1) = '3' then '9'
when substr(@identityno, 18, 1) = '2' then '10'
end
) then '身份证合法性校验不通过'
else '有效身份证'
end as ret
from dual
set @identityno='53010219200508011x';
select
case when substr(@identityno, 7, 4) not between '1900' and '2022' then '身份证年份校验不通过'
when substr(@identityno, 11, 2) not between '01' and '12' then '身份证月份校验不通过'
when substr(@identityno, 13, 2) not between '01' and '31' then '身份证日期校验不通过'
when mod(
(
substr(@identityno, 1, 1) * 7 + substr(@identityno, 2, 1) * 9 + substr(@identityno, 3, 1) * 10 + substr(@identityno, 4, 1) * 5 + substr(@identityno, 5, 1) * 8 + substr(@identityno, 6, 1) * 4 + substr(@identityno, 7, 1) * 2 + substr(@identityno, 8, 1) * 1 + substr(@identityno, 9, 1) * 6 + substr(@identityno, 10, 1) * 3 + substr(@identityno, 11, 1) * 7 + substr(@identityno, 12, 1) * 9 + substr(@identityno, 13, 1) * 10 + substr(@identityno, 14, 1) * 5 + substr(@identityno, 15, 1) * 8 + substr(@identityno, 16, 1) * 4 + substr(@identityno, 17, 1) * 2
),
11
) <> (
case
when substr(@identityno, 18, 1) = '1' then '0'
when substr(@identityno, 18, 1) = '0' then '1'
when substr(@identityno, 18, 1) in ('X', 'x') then '2'
when substr(@identityno, 18, 1) = '9' then '3'
when substr(@identityno, 18, 1) = '8' then '4'
when substr(@identityno, 18, 1) = '7' then '5'
when substr(@identityno, 18, 1) = '6' then '6'
when substr(@identityno, 18, 1) = '5' then '7'
when substr(@identityno, 18, 1) = '4' then '8'
when substr(@identityno, 18, 1) = '3' then '9'
when substr(@identityno, 18, 1) = '2' then '10'
end
) then '身份证合法性校验不通过'
else '有效身份证'
end as ret
from dual