繁体   English   中英

Cursor for loop - substr(char) 到日期,减去 sysdate - PLSQL Oracle

[英]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)给你六个字符 => 19490321
  • to_date(substr(pers_nr, 1, 6), '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, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM