Wpisany przez Tomasz Lubiński,
06 października 2005 18:46
Zgodnie z informacją zamieszczoną na stronach rządowych Rejestr PESEL – Powszechny Elektroniczny System Ewidencji Ludności prowadzony jest od 1979 roku i zawiera dane osób przebywających stale na terytorium RP, zameldowanych na pobyt stały lub czasowy trwający ponad 2 miesiące a także osób ubiegających się o wydanie dowodu osobistego lub osób, dla których odrębne przepisy przewidują potrzebę posiadania numeru PESEL.
Budowa numeru PESEL jest następująca:
Jak zapewne zauważyłeś zapis taki nie pozwoliłby na rozróżnienie osób urodzonych w latach np. 1999 i 1899. Dlatego też dla odróżnienia do numeru miesiąca dodawane są następujące wartości:
Tak więc początek numeru PESEL osoby urodzonej 10 lutego 1899 roku będzie wyglądał tak: 998210... a osoby urodzonej 10 lutego 1999 roku tak: 990210...
Teraz została nam jeszcze sprawa obliczania sumy kontrolnej. Każdą pozycję numeru ewidencyjnego mnoży się przez odpowiednią wagę, są to kolejno: 1 3 7 9 1 3 7 9 1 3. Następnie utworzone iloczyny dodaje się i wynik dzieli się modulo 10. Wynik ten należy odjąć od 10 i znów podzielić przez modulo 10 (to zabezpieczenie gdybyśmy w poprzednim kroku otrzymali 10).
Rozważmy PESEL osoby urodzonej 8 lipca 1902 roku, płci żeńskiej (parzysta końcówka numeru z serii – 0362). Czyli mamy wówczas 0207080362. Teraz kolejne cyfry należy przemnożyć przez odpowiednie wagi i dodać do siebie.
0*1 + 2*3 + 0*7 + 7*9 + 0*1 + 8*3 + 0*7 + 3*9 + 6*1 + 2*3 = 0 + 6 + 0 + 63 + 0 + 24 + 0 + 27 + 6 + 6 = 132
Wynik dzielimy modulo przez 10.
132 mod 10 = 2
A następnie odejmujemy od 10
10 - 2 = 8.
I wynik dzielimy znów modulo 10
8 mod 10 = 8
Cyfra kontrolna to 8, zatem nasz prawidłowy numer PESEL to: 02070803628
Budowa numeru PESEL jest następująca:
- cyfry 1-2 to ostatnie dwie cyfry roku urodzenia
- cyfry 3-4 to dwie cyfry miesiąca urodzenia
- cyfry 5-6 to dwie cyfry dnia urodzenia
- cyfry 7-10 liczba porządkowa z oznaczeniem płci (liczba parzysta - kobieta, liczba nieparzysta - mężczyzna)
- cyfra 11 suma kontrolna
Jak zapewne zauważyłeś zapis taki nie pozwoliłby na rozróżnienie osób urodzonych w latach np. 1999 i 1899. Dlatego też dla odróżnienia do numeru miesiąca dodawane są następujące wartości:
- dla lat 1800 - 1899 - 80
- dla lat 1900 - 1999 - 0
- dla lat 2000 - 2099 - 20
- dla lat 2100 - 2199 - 40
- dla lat 2200 - 2299 - 60
Tak więc początek numeru PESEL osoby urodzonej 10 lutego 1899 roku będzie wyglądał tak: 998210... a osoby urodzonej 10 lutego 1999 roku tak: 990210...
Teraz została nam jeszcze sprawa obliczania sumy kontrolnej. Każdą pozycję numeru ewidencyjnego mnoży się przez odpowiednią wagę, są to kolejno: 1 3 7 9 1 3 7 9 1 3. Następnie utworzone iloczyny dodaje się i wynik dzieli się modulo 10. Wynik ten należy odjąć od 10 i znów podzielić przez modulo 10 (to zabezpieczenie gdybyśmy w poprzednim kroku otrzymali 10).
Przykład:
Rozważmy PESEL osoby urodzonej 8 lipca 1902 roku, płci żeńskiej (parzysta końcówka numeru z serii – 0362). Czyli mamy wówczas 0207080362. Teraz kolejne cyfry należy przemnożyć przez odpowiednie wagi i dodać do siebie.
0*1 + 2*3 + 0*7 + 7*9 + 0*1 + 8*3 + 0*7 + 3*9 + 6*1 + 2*3 = 0 + 6 + 0 + 63 + 0 + 24 + 0 + 27 + 6 + 6 = 132
Wynik dzielimy modulo przez 10.
132 mod 10 = 2
A następnie odejmujemy od 10
10 - 2 = 8.
I wynik dzielimy znów modulo 10
8 mod 10 = 8
Cyfra kontrolna to 8, zatem nasz prawidłowy numer PESEL to: 02070803628
Implementacje
Autor | Język programowania | Komentarz | Otwórz | Pobierz | Ocena |
Tomasz Lubiński | C/C++ | .cpp | .cpp | ***** / 22 | |
Tomasz Lubiński | Delphi/Pascal | .pas | .pas | ***** / 6 | |
Tomasz Lubiński | Java | .java | .java | ***** / 31 |
Poprawiony: 29 sierpnia 2012 20:05
Niestety to chyba nie do końca się sprawdza, moja dziewczyna ma w dowodzie \"081\" w przedziale 7-10 cyfra...
A od kiedy to 7-10 cyfra to tylko 3 cyfry?
PESEL: 84040206943
1*8 + 3*4 + 7*0 + 9*4 + 1*0 + 3*2 + 7*0 + 9*6 + 1*9 + 3*4 = 8 + 12 + 0 + 36 + 0 + 6 + 0 + 54 + 9 + 12 = 137
A mnie suma wychodzi 137, więc po odjęciu (137 mod 10 = 7) 10-7=3. Tak więc cyfra kontrolna się zgadza.
Tyle, że moim zdaniem to tylko jedna z miejskich legend...
Licz sam i na siebie
SELECT
mod(10-mod(SUBSTR(REGE XP_REPLACE( PESEL,'[^[:digit:]]',''),1,1)*1+
SUBSTR(REGEXP_R EPLACE( PESEL,'[^[:digit:]]',''),2,1)*3+
SUBSTR(REGEXP_R EPLACE( PESEL,'[^[:digit:]]',''),3,1)*7+
SUBSTR(REGEXP_R EPLACE( PESEL,'[^[:digit:]]',''),4,1)*9+
SUBSTR(REGEXP_R EPLACE( PESEL,'[^[:digit:]]',''),5,1)*1+
SUBSTR(REGEXP_R EPLACE( PESEL,'[^[:digit:]]',''),6,1)*3+
SUBSTR(REGEXP_R EPLACE( PESEL,'[^[:digit:]]',''),7,1)*7+
SUBSTR(REGEXP_R EPLACE( PESEL,'[^[:digit:]]',''),8,1)*9+
SUBSTR(REGEXP_R EPLACE( PESEL,'[^[:digit:]]',''),9,1)*1+
SUBSTR(REGEXP_R EPLACE( PESEL,'[^[:digit:]]',''),10,1)*3
,10),10) AS VAL, SUBSTR(REGEXP_R EPLACE( PESEL,'[^[:digit:]]',''),11,1) AS CHECK_SUM,
PESEL from table;
A co w przypadku osob z data urodzenia djamy na to 1899.11.10 ? Czyli pesel 99811... ?? :)
"Jak zapewne zauważyłeś zapis taki nie pozwoliłby na rozróżnienie osób urodzonych w latach np. 1999 i 1899. Dlatego też dla odróżnienia do numeru miesiąca dodawane są następujące wartości:
dla lat 1800 - 1899 - 80
dla lat 1900 - 1999 - 0
...
Tak więc początek numeru PESEL osoby urodzonej 10 lutego 1899 roku będzie wyglądał tak: 998210... a osoby urodzonej 10 lutego 1999 roku tak: 990210..."
A czemu jak jestem urodzony 10.11.1988, to mój PESEL zaczyna się od: 881110...?
Więc jakie "0" na trzeciej pozycji?
Jaki jest sens ponownego dzielenia modulo 10?
Pierwsze dzielenie modulo 10 zapewnia na wynik 'x' < 10. Jeśli od 10 odejmiemy x, to nadal mamy liczbę < 10. A więc ostatnie działanie nie zmieni nigdy wyniku.
Czy coś przeoczyłem?
Wówczas mamy 10 - 0 = 10.
Dlatego ten wynik znów dzielimy modulo 10 żeby otrzymać cyfrę kontrolną - w tym wypadku 0.
declare @p as varchar(11)
set @p='tu wpisz pesel'
select
case when
((10-(((SUBSTRING(@p ,1,1)*1)+(SUBSTRING(@p ,2,1)*3)+(SUBSTRING(@p ,3,1)*7)+(SUBSTRING (@p ,4,1)*9)+(SUBSTRING (@p ,5,1)*1)
+(SUBSTRING(@p, 6,1)*3)+(SUBSTRING(@p ,7,1)*7)+(SUBSTRING (@p ,8,1)*9)+(SUBSTRING (@p ,9,1)*1)+(SUBSTRING(@p ,10,1)*3)) % 10)) % 10) =SUBSTRING(@p,11,1)
then 'PESEL poprawny' else 'ZŁY PESEL' end
Cyfra kontrolna i sprawdzanie poprawności numeru[edytuj | edytuj kod]
Jedenasta cyfra jest cyfrą kontrolną, służącą do wychwytywania przekłamań numeru. Jest ona generowana na podstawie pierwszych dziesięciu cyfr. Aby sprawdzić czy dany numer PESEL jest prawidłowy, należy, zakładając, że litery a-j to kolejne cyfry numeru od lewej, obliczyć wyrażenie:
9×a + 7×b + 3×c + 1×d + 9×e + 7×f + 3×g + 1×h + 9×i + 7×j
Jeżeli ostatnia cyfra otrzymanego wyniku nie jest równa cyfrze kontrolnej, to znaczy, że numer zawiera błąd[18].
Przykład dla numeru PESEL 44051401358:
9×4 + 7×4 + 3×0 + 1×5 + 9×1 + 7×4 + 3×0 + 1×1 + 9×3 + 7×5 = 169
Wyznaczamy resztę z dzielenia sumy przez 10:
169:10 = 16 reszta = 9
Wynik 9 nie jest równy ostatniej cyfrze numeru PESEL, czyli 8, więc numer jest błędny.
Rozumiem, że samo działanie jest niezbędne ze względu na algorytm, jednak uzasadnienie trochę błędne.
Wówczas mamy 10 - 0 = 10.
Dlatego ten wynik znów dzielimy modulo 10 żeby otrzymać cyfrę kontrolną - w tym wypadku 0.