Я хотел бы рассчитать возраст по дате рождения, хранящейся в виде строки, используя формат в комментариях в коде. Вот мой код:
--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;
В результате я получаю следующее:
Statement processed.
Age is: -1935.252688172043010752688172043010752692
Age is: -1940.115591397849462365591397849462365592
Age is: -1951.674731182795698924731182795698924733
Я предполагаю, что что-то не так с годом, но я не могу понять это!
Правильно, сейчас я отредактировал теги
Ошибка именно в этой строке:
v_now date :=to_date(sysdate, 'YYYY-MM-DD');
Вы не должны вызывать to_date
на sysdate
, потому что sysdate
уже имеет тип данных date
.
Вы должны просто сделать:
v_now date := sysdate;
Или даже исключите эту переменную и используйте sysdate
непосредственно в своих вычислениях.
Я бы также изменил другой формат даты на YYYYMMDD
, поскольку в данных вашей таблицы нет дефисов.
Обратите внимание, что вы можете сделать это без PL/SQL с помощью запроса:
select pnr,
months_between(sysdate, to_date(substr(pnr,1,8), 'YYYYMMDD'))/12
from carowners;
Конечно! Он работает отлично, большое спасибо!
mysql не plsql. Я полагаю, это не имеет ничего общего с MySQL?