Wiem dlaczego zwraca;) Nie znam oracla więc przyznam że ciężko mi się w nim pisze. Mysle o czyms takim (na razie niedzialającym).
W zaleznosci od miesiaca dodaje tekstowo 18,19 lub 20 (pomijam na razie inne)
select PESEL,
trunc( months_between( SYSDATE, TO_DATE(substr(pesel,1,6),'yymmdd') ) /12 ) as wiek,
to_number(substr(pesel,1,2), '99') as rok,
to_number(substr(pesel,3,2), '99') as miesiac,
to_number(substr(pesel,5,2), '99') as dzien,
CASE
WHEN to_number(substr(pesel,3,2), '99') BETWEEN 01 AND 12
THEN
trunc( months_between( to_date(SYSDATE,'YYYYMMDD'), TO_DATE(
'19'||substr(pesel,1,2), '99') ||to_number(substr(pesel,3,2)||substr(pesel,5,2)
,'yyyymmdd') ) /12 )
WHEN to_number(substr(pesel,3,2), '99') BETWEEN 81 AND 92
THEN
trunc( months_between( to_date(SYSDATE,'YYYYMMDD'), TO_DATE(
'18'||substr(pesel,1,2), '99') ||to_number(substr(pesel,3,2)-80||substr(pesel,5,2)
,'yyyymmdd') ) /12 )
WHEN to_number(substr(pesel,3,2), '99') BETWEEN 21 AND 32
THEN
trunc( months_between( to_date(SYSDATE,'YYYYMMDD'), TO_DATE(
'20'||substr(pesel,1,2), '99') ||to_number(substr(pesel,3,2)-20||substr(pesel,5,2)
,'yyyymmdd') ) /12 )
ELSE 'taki pesel nie mogl zostac nadany'
END ) wiek
FROM KLIENT ;
END