如何解决循环游标 - substr(char) 到日期,减去 sysdate - PLSQL Oracle
也许有人可以帮助我.. 我在这里有循环光标。我想打印出名字和年龄(小数点,例如 55,6 岁)。我知道我的代码的 WHERE 部分不正确。 我试图从 varchar2(12) 字符串中使用 substr() 函数获取前 6 个字符(年和月)。然后我想将其更改为日期并从系统日期中减去。也许我错了。感觉很困惑:(
CREATE TABLE client(
pers_nr VARCHAR2(12) PRIMARY KEY,fname VARCHAR2(20);
INSERT INTO client VALUES('19490321-789','Anna');
declare
cursor c_info_client is select fname,substr(pers_nr,1,6)
from client
--wrong!-- where substr(pnr,6) : = to_date(YYYY-MM) - sysdate;
begin
for rec in c_info_client loop
dbms_output.put_line(initcap(rec.fname) ||',' || rec.pers_pnr ||' years');
end loop;
end;
答案应该看起来像(多行之一):
安娜,34,7 岁
解决方法
您似乎根本不需要 where
子句;您想将 pers_nr
的前六个字符转换为日期,并查看该日期与今天之间有多少年。
您可以通过以下方式计算年龄:
trunc(months_between(sysdate,to_date(substr(pers_nr,1,6),'YYYYMM'))/12,1)
-
substr(pers_nr,6)
为您提供六个字符 => 19490321 -
to_date(substr(pers_nr,'YYYYMM')
将其转换为日期 => 1949-03-21 -
months_between(sysdate,...)
为您提供月数 => 839.4 -
months_between(sysdate,...)/12
为您提供年数=> 72.196 -
trunc(...,1)
将其截断到一位小数 => 72.1
所以你的 PL/SQL 块将是:
declare
cursor c_info_client is
select fname,trunc(months_between(sysdate,1) as age
from client;
begin
for rec in c_info_client loop
dbms_output.put_line(initcap(rec.fname) ||',' || rec.age ||' years');
end loop;
end;
/
给出:
Anna,72.1 years
db<>fiddle 带有一个游标和一个简单的查询来显示步骤。
您可以使用 trunc(sysdate)
从今天早上的午夜开始计算时间,但在这里不会有太大区别。
默认情况下,年龄将使用会话 NLS_NUMERIC_CHARACTERS 设置中的小数分隔符显示。如果您希望所有用户始终看到相同的分隔符,您可以使用带有合适格式掩码的 to_char()
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。