【问题标题】:How do I delete employees at a time who worked more than 5 years如何一次删除工作超过 5 年的员工
【发布时间】:2021-02-09 03:47:13
【问题描述】:

如果某位员工工作超过 5 年,我有一个代码会删除他/她。我想一次性将此声明应用于所有员工。

DECLARE 
  currentDate DATE := SYSDATE;
  hireDate Date;
  empId number := 100;
BEGIN
    
    SELECT hire_date INTO hireDate FROM employees
    WHERE employee_id = empId;
    
        DELETE FROM emp
        WHERE (currentDate-hireDate) / 365 > 5 AND employee_id = empId;
        DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT || ' rows deleted.');
END;

如您所见,我将 empId 声明为 100。此员工的currentDate-hireDate / 365 > 5 返回 4,这是错误的。我的桌子上有 107 名员工,从 100 到 206。如果我删除 WHERE employee_id = empId; ,它会返回太多行错误。您对此有何建议?

【问题讨论】:

  • 删除employee_id = empId 子句时遇到什么错误?
  • 错误太多行表明 empid 列在您的表 emp 中不是唯一的
  • 正确的方法是使用 SQL 查询而不是 PL/SQL 编码方式
  • 从 emp WHERE 中删除 (sysdate-hireDate) / 365 > 5;
  • @GeorgeJoseph 此声明存在一些问题; (1) 伪列sysdate 有时间部分,(2) 除以365 可能会由于闰年而产生错误结果

标签: sql oracle plsql sql-delete


【解决方案1】:

试试这个。

 DATEDIFF(dd,hireDate,currentDate)/365.0

【讨论】:

  • 但是Oracle DB中不存在这样的预定义函数。
【解决方案2】:

您可以将MONTHS_BETWEEN() 函数与TRUNC() 一起使用,而无需PL/SQL

DELETE emp 
 WHERE TRUNC( MONTHS_BETWEEN( current_date, hire_date ) / 12 ) >= 5
   AND employee_id = 100

除了包含 确切的 5 年 差异,但我建议您宁愿使用软删除,例如

UPDATE emp
   SET active = 0 
 WHERE TRUNC( MONTHS_BETWEEN( current_date, hire_date ) / 12 ) >= 5
   AND employee_id = 100
   AND active = 1

如果你还想用PL/SQL,那就用下面的代码

DECLARE 
  empId   emp.employee_id%type := 100;
BEGIN
  UPDATE emp
     SET active = 0 
   WHERE TRUNC( MONTHS_BETWEEN( current_date, hire_date ) / 12 ) >= 5
     AND employee_id = 100
     AND active = 1;
     
  DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT || ' rows deleted.');
END;
/

其中局部变量 currentDate(使用 current_date 函数代替)、hireDateSELECT 语句在当前案例中是多余的。

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多