在我的表中存在一段时间后,我在删除一行时遇到问题。更具体地说,我有一个名为' hiredate'并且我想在该行的hiredate超过5年时删除一行。
答案 0 :(得分:4)
关于评论中的代码:
delete from emp where p_id = (select p_id from emp where sysdate = hiredate+1825);
在这里使用子查询完全没必要。你可以这样做:
DELETE FROM emp WHERE sysdate = hiredate + 1825;
当然,这仅适用于hiredate
的时间部分恰好等于SYSDATE
的时间部分的情况!此外,1825
不是五年;它是365的五倍。在Oracle中更好的方法是:
DELETE FROM emp
WHERE hiredate < TRUNC(ADD_MONTHS(SYSDATE, -60));
或者,如果您确定只想删除一天的结果:
DELETE FROM emp
WHERE hiredate >= TRUNC(ADD_MONTHS(SYSDATE, -60)) - 1
AND hiredate < TRUNC(ADD_MONTHS(SYSDATE, -60));
但是,如果您将其作为一次性查询或甚至作为预定作业运行,则您需要删除五年以上的所有内容;例如,预定的工作可能总是在一晚失败并在下一个工作中成功,在EMP
中留下奇数日的记录。
顺便说一句,ADD_MONTHS()
是在Oracle中添加或减去年份最安全的方式;在闰年期间,每年的间隔时间可能会失败。例如,以下内容将于2016年2月29日失败:
DELETE FROM emp
WHERE hiredate < TRUNC(SYSDATE) - INTERVAL '5' YEAR;
等式的右边将计算到2011年2月29日的日期,该日期不存在。