我下面有一个查询正在计算年龄并且它有效。
当我添加测试以打印 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
/
删除
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)