【问题标题】:Calculate age from date of birth with formatting使用格式从出生日期计算年龄
【发布时间】:2020-12-13 17:37:48
【问题描述】:

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

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

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

【问题讨论】:

  • mysql 不是 plsql。我想这与mysql无关?
  • 没错,我现在编辑了标签

标签: sql plsql


【解决方案1】:

错误在这一行:

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

您不应在sysdate 上调用to_date,因为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;

【讨论】:

  • 当然!效果很好,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
相关资源
最近更新 更多