1

Temat: jak z pesel pobrać datę (typ char -> data)

No właśnie zaczynam się zastanawiać jak za pomocą SQL z pola typu znakowego zawierającego PESEL tak wyciągnąć z łańcucha początkowe znaki aby przerobić je na datę urodzenia i to z myślnikami w środku np. 80030311111 na 1980-03-03 a następnie zapisać w innym polu(kolumnie) tej samej lub innej tabeli?
Może ktoś już to przećwiczył?

Do zrobienia roku można użyć operator  „||” do łączenia tekstów.

Podziękowania dla rski za poniższy piękny kawałek kodu, idę testować smile))) dzięki...dzięki...

Ostatnio edytowany przez r_k2 (2009-02-24 14:16:14)

2

Odp: jak z pesel pobrać datę (typ char -> data)

Może coś takiego  (tabela nazywa sie 'q', kolumna z peselem 'i')

select case 
           when substr(i,3,1)=2 then 
                  (substr(i,5, 2)||'-'||'0'||substr(i,4,1)||'-'||'20'||substr(i,1,2))::date 
           when substr(i,3,1)=3 then 
                  (substr(i,5, 2)||'-'||'1'||substr(i,4,1)||'-'||'20'||substr(i,1,2))::date 
           else 
                 (substr(i,5, 2)||'-'||substr(i,3,2)||'-'||'19'||substr(i,1,2))::date 
        end  
from q;

Ze wstawianiem tez nie powinno byc problemu. Mozesz zrobic update ktory wpisuje wynik selecta i analogicznie z insertem do innej tabeli.

3

Odp: jak z pesel pobrać datę (typ char -> data)

wstępnie przetestowano zapytanie do bazy i oto wynik:

ERROR:  date/time field value out of range: "24-04-1967"
HINT:  Perhaps you need a different "datestyle" setting.

Więc teraz zamienię kolejność aby było "1967-04-24" ale dziś już nie zdążę pokazać efektu.

ale zastanawia mnie pierwszy i drugi when = 2 i 3 ...czy to jest jakieś nadpisanie błędnie wpisanego miesiąca czyli gdyby miesiąc =23 lub 33 czy może jeśli w peselu tak będzie to oznacza to coś szczególnego?

Ostatnio edytowany przez r_k2 (2009-02-24 15:29:39)

4

Odp: jak z pesel pobrać datę (typ char -> data)

Osoby urodzone w 200X roku musza byc odzroznianie od tych urodzonych w 19x np

010101xxx urodzony w 2001 czy 1901 ? smile

dlatego np mamy pesel
042630xxx  co oznacza 30-06-2004   (to na pewno)
a chyba
043130xxx to bedzie 30-11-2004 (tu troche strzelam smile ). Trza by zobaczyc w sieci jaki jest algorytm. Ale ogolnie zapytanie powinno byc ok, po malych ew. poprawkach.

5

Odp: jak z pesel pobrać datę (typ char -> data)

Przedstawiam dalszy ciąg testów i to, co z tego wynikło wink

Sprawdzono, czy jest potrzeba zajmowania się młodszymi rocznikami - nie ma od 2000 więc są 19...:

SELECT * FROM osoba WHERE data_ur >= 2000-01-01 LIMIT 5;
Skoro nie ma roczników młodszych jak 2000 to wykorzystam tylko jeden warunek z rozpatrywanego SELECT i w zmienionym ustawieniu formatu daty czyli od roku.

SELECT ('19'||substr(pesel,1,2)||'-'||substr(pesel,3,2) ||'-'|| substr(pesel,5, 2))::date FROM osoba LIMIT 5;

wyszukało ok., a teraz dla pustych data_ur, które to chcę uzupełnić i w celu porównania z wypisanym peselem i datą ur.:

SELECT pesel,data_ur, ('19'||substr(pesel,1,2)||'-'||substr(pesel,3,2) ||'-'|| substr(pesel,5, 2))::date FROM osoba WHERE data_ur IS NULL LIMIT 5;
wyszukało  z pustymi polami data_ur ok.

To teraz przerabiam na UPDATE:
UPDATE osoba SET data_ur = ('19'||substr(pesel,1,2)||'-'||substr(pesel,3,2) ||'-'|| substr(pesel,5, 2))::date WHERE data_ur IS NULL;

Ale niestety nie mogę podać teraz efektu, bo wychodzą niezgodności przez które, to jest niemożliwe.
W pierwszej kolejności należałoby wyłowić i poprawić pomyłki w peselu :

ERROR:  date/time field value out of range: "1945-22-90"
HINT:  Perhaps you need a different "datestyle" setting.

a to byłby wtedy taki początek PESEL: 452290

No ale jak to zrobić za jednym zamachem? Teraz wyszukuję SELECTem początek takiego pesel (LIKE '452290%') i zaraz  UPDATE osoba SET pesel = '451202....'   poprawiam , znowu powtarzam  UPDATE osoba SET data_ur ...  i poprawiam blokujący błąd... ale ile to potrwa?
Nie wiem jak policzyć ile jest takich przypadków? Więc od jutra będę wyszukiwać jakoś bardziej ogólnie SELECT ... ale jeszcze nie wiem jak, może np. pesel LIKE ' ______ %'   czyli jakiekolwiek anomalia przyjda mi do głowy smile

Ostatnio edytowany przez r_k2 (2009-02-25 15:59:31)

6

Odp: jak z pesel pobrać datę (typ char -> data)

hmm, twoje pytanie brzmi
'jak jednym zapytanie wyświetlić/policzyć złe pesele?', bo trochę nie skumałem smile.