微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何删除工作超过 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。