PostgreSQL生成隨機身份證ID

德哥發表於2017-10-28

標籤

PostgreSQL , 身份證號生成


背景

生成隨機身份證號。

規則

前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


相關文章