sql - 使用格式从出生日期计算年龄
问题描述
我想使用代码注释中的格式从存储为字符串的出生日期计算年龄。这是我的代码:
--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;
推荐阅读
- css - 对文字进行叠加图像亮度调整
- html - CSS 旋转信息卡闪烁
- gunicorn - 我不想输出到 gunicorn 中的 nuhup.out 文件怎么样
- sql - SQL如何有条件地将值与另一个表中的条件相加
- javascript - 当我根据其他状态更新状态时,React 给我错误“重新渲染太多。React 限制渲染次数以防止无限循环。”
- java - 有没有更清晰的方法来处理短期的选项?
- c# - 在 ASP.NET MVC 项目中使用 REST API 的正确方法是什么?
- python - Python socket connect_ex() 似乎卡住了,具体取决于操作系统
- google-chrome - 如何将本机主机与 Chrome 扩展程序捆绑并发布?
- javascript - 带有 .p12 和 pem 证书的 Node.js POST 请求输出“错误:读取 ECONNRESET”