用于从Oracle DB表

时间:2018-02-23 11:03:05

标签: sql oracle unix

我有一种情况,我需要每30天运行一次shell脚本来删除Oracle数据库表中的记录。

该表格中有一列&updated;更新日期'。我需要编写一个查询来删除记录,其中“updated_date'小于当前日期减去30天。

在Java中,我可以轻松地完成它。如何计算动态日期并将其传递给Unix shell脚本中的SQL查询。

有人可以帮帮我吗。

2 个答案:

答案 0 :(得分:1)

您可以使用Littlefoot建议的删除语句来利用数据库中的系统日期。

但是,既然你问过 -

  

如何计算动态日期并将其传递给Unix中的SQL查询   shell脚本,

这就是你可以做到的。

首先,使用date命令以'yyyy-mm-dd'格式获取当前日期。

export dt=$(date +%Y-%m-%d)

然后,您可以在sqlplus中的shell脚本中使用日期变量。

sqlplus -s userid/passwd@db_server<<EOF
delete from yourtable
      where updated_date < DATE '${dt}' - 30;
commit;
exit
EOF

答案 1 :(得分:0)

这将是这样的:

delete from your_table
where updated_date < trunc(sysdate) - 30;

SYSDATE是一个返回当前日期的函数(和时间 - 这就是我使用TRUNC函数删除时间组件的原因)。这也意味着您不必计算日期并将其传递给SQL查询 - Oracle自己知道。

但请注意,SYSDATE显示数据库服务器日期,因此 - 如果您处理不同的时区,则可能需要考虑这一事实。

此外,“减去30天”:它总是30天,还是你的意思是“减1个月”?如果是这样,您将条件更改为

where updated_date < add_months(trunc(sysdate), -1)

它会照顾一个月内的天数(30,31;包括二月和闰年)。