当sysdate是oracle sql中的某个值时删除一行

时间:2015-03-17 16:56:30

标签: sql oracle

在我的表中存在一段时间后,我在删除一行时遇到问题。更具体地说,我有一个名为' hiredate'并且我想在该行的hiredate超过5年时删除一行。

1 个答案:

答案 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日的日期,该日期不存在。