ORA-00904: "DAYS": 无效标识符

Posted

技术标签:

【中文标题】ORA-00904: "DAYS": 无效标识符【英文标题】:ORA-00904: "DAYS": invalid identifier 【发布时间】:2018-09-27 20:54:34 【问题描述】:

这是我的代码:

SELECT (first_name || ' ' || last_name) AS Name, hire_date, days FROM EMPLOYEES WHERE days > 365*6;

这是我应该做的: 从 EMPLOYEES 表中创建一个 SQL 查询,显示 first_name、last_name、hire_date 和员工工作的天数。使用连接运算符将 first_name 和 last_name 放在结果集中的同一列中,两个名称之间有一个空格。使用日期算术仅显示工作时间超过 6 年 (365 * 6) 的员工。

谁能帮我弄清楚我的错误是什么?

【问题讨论】:

很明显,days 不是employees 中的列。 错误信息的哪一部分不清楚?您的表是否有名为DAYS 的列?如果不是,那么您知道这就是问题所在。 任务中有提示:“使用日期算术...”。您已经知道雇用日期,那么您将如何获得使用该日期的天数? 显然 365 * 6 与六年不一样,但如果这是你的家庭作业要求的,那很好...... 【参考方案1】:

要更正您的查询,您需要执行日期算术。

SELECT
  (first_name || ' ' || last_name) AS name,
  hire_date,
  ROUND(sysdate - hire_date) AS days
FROM hr.employees
WHERE sysdate - hire_date > 6*365;

但是如果你分析 -> hr schema,你会发现,有与这个任务相关的 job_history 表。在我看来,正确的解决方案应该是这样的:

SELECT a1.name,
  a1.hire_date,
  a1.days
FROM
  (SELECT employees.employee_id,
    (employees.first_name || ' ' || employees.last_name) AS name,
    employees.hire_date,
    SUM(NVL(job_history.end_date, TRUNC(sysdate)) - NVL(job_history.start_date, hire_date)) AS days
  FROM hr.employees
  LEFT JOIN hr.job_history
  ON job_history.employee_id = employees.employee_id
  GROUP BY employees.employee_id,
    (employees.first_name || ' ' || employees.last_name),
    employees.hire_date
  ) a1
WHERE days > 365*6;

【讨论】:

【参考方案2】:

您可以尝试在招聘日设置过滤器

雇佣日期> sysdate - 365*6

【讨论】:

【参考方案3】:

这会起作用;

 WHERE sysdate-hire_date >= 365*6

【讨论】:

以上是关于ORA-00904: "DAYS": 无效标识符的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00904: 无效标识符 00904. 00000 - "%s: 无效标识符"

ORA-00904: "FORMAT": 无效标识符

ORA-00904: "CEILING": ORACLE 11G 中的标识符无效

ORA-00904: "pass": 无效的标识符

ORA-00904: "PREV_TEMP": 带有 LAG 函数的无效标识符

SQL 错误:ORA-00904:“GENDER”:无效标识符 00904。00000 -“%s:无效标识符”