I would like to calculate the age from the date of birth stored as a string using the format in the comments in the code. Here’s my code:
x
--pnr values
--'19490321-7000'
--'19540201-7000'
--'19650823-7000'
declare
v_now date :=to_date(sysdate, 'YYYY-MM-DD');
v_dob date;
v_age number;
cursor c_carowners is select fnamn, enamn, pnr
from carowners;
begin
for v_rec in c_carowners loop
v_dob:= to_date(substr(v_rec.pnr,1,8), 'YYYY-MM-DD');
v_age := (months_between(v_now, v_dob))/12;
dbms_output.put_line('Age is: '||v_age);
end loop;
end;
The result I get is the following:
Statement processed.
Age is: -1935.252688172043010752688172043010752692
Age is: -1940.115591397849462365591397849462365592
Age is: -1951.674731182795698924731182795698924733
I guess there’s something wrong with the year but I can’t figure it out!
Advertisement
Answer
The error is in this line:
v_now date :=to_date(sysdate, 'YYYY-MM-DD');
You should not call to_date
on sysdate
, because sysdate
already has the data type date
.
You should just do:
v_now date := sysdate;
Or, even leave out that variable, and use sysdate
directly in your calculation.
I would also change the other date format to YYYYMMDD
, since your table data has no hyphens.
Note that you can do this without PL/SQL, with a query:
select pnr,
months_between(sysdate, to_date(substr(pnr,1,8), 'YYYYMMDD'))/12
from carowners;