如何删除工作超过 5 年的员工

问题描述

我有一个代码,可以删除工作超过 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; ,它会返回太多行错误。你有什么可以推荐给我的吗?

解决方法

试试这个。

 DATEDIFF(dd,hireDate,currentDate)/365.0
,

您可以将 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