首页 > 解决方案 > 使用格式从出生日期计算年龄

问题描述

我想使用代码注释中的格式从存储为字符串的出生日期计算年龄。这是我的代码:

--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

我想这一年有什么问题,但我想不通!

标签: sqlplsql

解决方案


错误在这一行:

v_now date :=to_date(sysdate, 'YYYY-MM-DD');

你不应该调用to_datesysdate因为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;

推荐阅读