【问题标题】:stacking syntax堆叠语法
【发布时间】:2019-04-13 03:09:56
【问题描述】:

这是关于我想根据他们的社会安全号码知道数据库中个人的年龄。所以 sysdate - 他们的出生日期采用合适的格式。想要的结果:John,Doe,45.6 岁。表格数据:

表:

pnr VARCHAR2(13) value'19790343-7899'

我一定遗漏了一些明显的东西。这是我到目前为止的代码:(包括一些测试代码)

关于日期的一切

--完整代码,下面尝试--

declare 
 cursor c_åldrar is 
 select fnamn,enamn,(sysdate - to_date(substr(pnr,1,6),'yyyymm')) / 365 
   from bilägare;

begin 
   for rec in c_åldrar 
   loop 
     dbms_output.put_line(rec.fnamn||', '||rec.enamn||', '||rec.pnr||', '||sysdate); 
   end loop; 
end; 
/

-- Attempt 1 
   select fnamn,enamn,sysdate - to_date(substr(pnr,1,6),'yyyymm') 
     from bilägare;

-- Attempt 2 
    select fnamn,enamn,(sysdate - to_date(substr(pnr,1,6),'yyyymm')) / 365 
      from bilägare;

【问题讨论】:

  • to_date(substr(pnr,1,6)||'01','yyyymmdd')

标签: sql oracle syntax


【解决方案1】:

显然,这是非常近似的结果

  • 您不知道准确的出生日期(年份和月份是的,但是日期?)
  • 年没有365年;闰年呢

因此,我们的约翰大约有 40 年。祝约翰生日快乐。

SQL> with bilagare (fnamn, enamn, pnr) as
  2    (Select 'John', 'Doe', '19790343-7899' from dual)
  3  select fnamn,
  4         enamn,
  5         round((trunc(sysdate) - to_date(substr(pnr, 1, 6), 'yyyymm')) / 365, 1) yrs
  6  from bilagare;

FNAM ENA        YRS
---- --- ----------
John Doe       40,1

SQL>

【讨论】:

  • 声明光标 c_åldrar 是 select fnamn,enamn,pnr from bilägare;在 c_åldrar 循环中开始记录 dbms_output.put_line(rec.fnamn||', '||rec.enamn||', '||round((trunc(sysdate) - to_date(substr(pnr, 1, 6), ' yyyymm')) / 365, 1)||', '||sysdate);结束循环;结尾; / 谢谢!但我得到 ORA-06550:第 6 行,第 100 列:PLS-00201:必须声明标识符“PNR”嗯不是通过游标声明声明的 pnr 吗?
  • 是的,但是你必须通过游标变量来引用它,即rec.pnr,而不仅仅是pnr
  • 啊是的,就是这样 :) 谢谢
猜你喜欢
  • 1970-01-01
  • 2011-05-03
  • 2016-05-13
  • 2013-11-29
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多