[英]Cursor for loop - substr(char) to date, subtracting sysdate - PLSQL Oracle
也许有人可以帮助我.. 我有 cursor for loop here。 我想打印出名字和年龄(以小数表示,例如 55,6 岁)。 我知道我的代码的 WHERE 部分不正确。 我正在尝试使用 substr() function 从 varchar2(12) 字符串中获取前 6 个字符(年和月)。 然后我想将其更改为日期并从 sysdate 中减去。 也许我错了。 感觉困惑:(
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, 1, 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, 1, 6)
给你六个字符 => 19490321to_date(substr(pers_nr, 1, 6), 'YYYYMM')
将其转换为日期 => 1949-03-21months_between(sysdate, ...)
为您提供月数 => 839.4months_between(sysdate, ...)/12
给你年数=> 72.196trunc(..., 1)
将其截断到小数点后一位 => 72.1因此,您的 PL/SQL 块将是:
declare
cursor c_info_client is
select fname,
trunc(months_between(sysdate, to_date(substr(pers_nr, 1, 6), 'YYYYMM'))/12, 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<> 摆弄一个 cursor 和一个简单的查询来显示这些步骤。
您可以使用trunc(sysdate)
从今天早上的午夜开始计算时间,但在这里不会有太大的不同。
默认情况下,年龄将使用 session NLS_NUMERIC_CHARACTERS 设置中的小数分隔符显示。 如果您希望所有用户始终看到相同的单独内容,则可以使用带有合适格式掩码的to_char()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.