如何解决如何删除工作超过 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
函数代替)、hireDate
和 SELECT
语句在当前情况下是多余的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。