计算年龄超过50岁

问题描述 投票:0回答:1

我下面有一个查询正在计算年龄并且它有效。

当我添加测试以打印 YES/NO 标志来测试 50 多年时,我收到语法错误,希望有人可以帮助我。

此外,是否有更好的方法来重写查询而不进行两次提取/计算?任何帮助将不胜感激。


/* WORKS */
with some_birthdays as 
 ( select date '1968-06-09' d from dual union all
  select date '1970-06-10' from dual union all
  select date '1972-06-11' from dual union all 
 select date '1974-12-11' from dual union all 
  select date '1976-09-17' from dual  ) 
 select trunc(sysdate) today  
       , d birth_date
      , extract(year from numtoyminterval(months_between(trunc(sysdate),d),'month')) age
   from some_birthdays 
/

/* FAILS*/

with some_birthdays as 
 ( select date '1968-06-09' d from dual union all
  select date '1970-06-10' from dual union all
  select date '1972-06-11' from dual union all 
 select date '1974-12-11' from dual union all 
  select date '1976-09-17' from dual  ) 
 select trunc(sysdate) today  
       , d birth_date
      , extract(year from numtoyminterval(months_between(trunc(sysdate),d),'month')) age,
CASE WHEN extract(year from numtoyminterval(months_between(trunc(sysdate),d),'month')) < 50
THEN 'NO' ELSE 'YES' END AS 'OVER_50' 
   from some_birthdays 
/

sql oracle
1个回答
0
投票

删除

OVER_50
周围的单引号 - 它是列名称/标识符,而不是字符串。为了不重复提取,只需使用内联视图(嵌套选择)首先计算
age
,然后您可以在父块中多次重复使用
age
。此外,您根本不需要使用
EXTRACT
NUMTOYMINTERVAL
- 只需使用简单的数学将月转换为年:

 with some_birthdays as 
 ( select date '1968-06-09' d from dual union all
  select date '1970-06-10' from dual union all
  select date '1972-06-11' from dual union all 
 select date '1974-12-11' from dual union all 
  select date '1976-09-17' from dual  ) 
 select trunc(sysdate) today  
       , d birth_date
      , age,
        CASE WHEN age < 50
        THEN 'NO' ELSE 'YES' END AS OVER_50
   from (SELECT d, 
                FLOOR(MONTHS_BETWEEN(TRUNC(SYSDATE),d)/12) age
           FROM some_birthdays)
© www.soinside.com 2019 - 2024. All rights reserved.