我有一种情况,我需要每30天运行一次shell脚本来删除Oracle数据库表中的记录。
该表格中有一列&updated;更新日期'。我需要编写一个查询来删除记录,其中“updated_date'小于当前日期减去30天。
在Java中,我可以轻松地完成它。如何计算动态日期并将其传递给Unix shell脚本中的SQL查询。
有人可以帮帮我吗。
答案 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;包括二月和闰年)。