身份证上隐藏很多客户信息,可以得知省份,出生日期,年龄,性别,下面来进行一一解析。
现在第二代身份证都是18位,第一代身份证15位,在第六位之后加上'19'变成18位即可。
一、身份证前两位代表出生所在省份,下面是身份证号码对应省份一览表:
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澳门特别行政区
二、身份证从第7位开始到第14位,是出生日期
SUBSTRING(card_id,7,8),从第7位开始取,取8个数
三、身份证第9位和第10位能判断年龄
首先解析出9、10位,然后用当前年份或事件发生年份减去9、10位即得年龄
四、身份证倒数第二位,即17位代表性别
奇数代表男性,偶数代表女性,可提取出17位数之后通过除以2看余数来判断,余数是1表示男性,余数是0表示女性。
下面通过代码来实现:
select card_id as '身份证',
case when length(card_id)=18 then SUBSTRING(card_id,7,8)
when length(card_id)=15 then concat(19,SUBSTRING(card_id,7,6)) end as '出生日期',
case left(card_id,2)
when '11' then '北京市'
when '12' then '天津市'
when '13' then '河北省'
when '14' then '山西省'
when '15' then '内蒙古自治区'
when '21' then '辽宁省'
when '22' then '吉林省'
when '23' then '黑龙江省'
when '31' then '上海市'
when '32' then '江苏省'
when '33' then '浙江省'
when '34' then '安徽省'
when '35' then '福建省'
when '36' then '江西省'
when '37' then '山东省'
when '41' then '河南省'
when '42' then '湖北省'
when '43' then '湖南省'
when '44' then '广东省'
when '45' then '广西壮族自治区'
when '46' then '海南省'
when '50' then '重庆市'
when '51' then '四川省'
when '52' then '贵州省'
when '53' then '云南省'
when '54' then '西藏自治区'
when '61' then '陕西省'
when '62' then '甘肃省'
when '63' then '青海省'
when '64' then '宁夏回族自治区'
when '65' then '新疆维吾尔自治区'
when '71' then '台湾省'
when '81' then '香港特别行政区'
when '82' then '澳门特别行政区'
else '未知'
end as 省份 ,
year(curdate())-if(length(card_id)=18,substring(card_id,7,4),if(length(card_id)=15,concat('19',substring(card_id,7,2)),null)) as 年龄,
case if(length(card_id)=18, cast(substring(card_id,17,1) as UNSIGNED)%2, if(length(card_id)=15,cast(substring(card_id,15,1) as UNSIGNED)%2,3))
when 1 then '男'
when 0 then '女'
else '未知'
end as 性别
FROM bills
WHERE bills.jc_rq>'2020-01-01'