PostgreSQL 生成随机身份证ID

less than 1 minute read

背景

生成随机身份证号。

规则

前1、2位数字表示:所在省(直辖市、自治区)的代码;

第3、4位数字表示:所在地级市(自治州)的代码;

第5、6位数字表示:所在区(县、自治县、县级市)的代码;

第7 - 14位数字表示:出生年、月、日;

第15、16位数字表示:所在地的派出所的代码;

第17位数字表示性别:奇数表示男性,偶数表示女性;

第18位数字是校检码:也有的说是个人信息码,不是随计算机的随机产生,它是用来检验身份证的正确性。校检码可以是0—9的数字,有时也用x表示。作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么此人的身份证就变成了19位。X是罗马数字的10,用X来代替10,可以保证公民的身份证符合国家标准。

方法

从简,只是用于测试。

create or replace function gen_id(  
  a date,  
  b date  
)   
returns text as $$  
select lpad((random()*99)::int::text, 2, '0') ||   
       lpad((random()*99)::int::text, 2, '0') ||   
       lpad((random()*99)::int::text, 2, '0') ||   
       to_char(a + (random()*(b-a))::int, 'yyyymmdd') ||   
       lpad((random()*99)::int::text, 2, '0') ||   
       random()::int ||   
       (case when random()*10 >9 then 'X' else (random()*9)::int::text end ) ;  
$$ language sql strict;  
  
  
postgres=# select gen_id('1900-01-01', '2017-10-16');  
       gen_id         
--------------------  
 808866195306076311  
(1 row)  

参考

https://jingyan.baidu.com/article/72ee561abd962fe16038df48.html

Flag Counter

digoal’s 大量PostgreSQL文章入口