【发布时间】:2018-02-23 20:39:50
【问题描述】:
我有一种情况,我需要每 30 天运行一次 shell 脚本来从 Oracle 数据库表中删除记录。
该表有一个列“updated_date”。我需要编写一个查询来删除“updated_date”小于当前日期减去 30 天的记录。
在 Java 中我可以轻松地做到这一点。如何计算动态日期并将其传递给 Unix shell 脚本中的 SQL 查询。
谁能帮帮我。
【问题讨论】:
我有一种情况,我需要每 30 天运行一次 shell 脚本来从 Oracle 数据库表中删除记录。
该表有一个列“updated_date”。我需要编写一个查询来删除“updated_date”小于当前日期减去 30 天的记录。
在 Java 中我可以轻松地做到这一点。如何计算动态日期并将其传递给 Unix shell 脚本中的 SQL 查询。
谁能帮帮我。
【问题讨论】:
您可以使用 Littlefoot 建议的删除语句来利用数据库中的系统日期。
但是,既然你问了——
如何计算动态日期并将其传递给 Unix 中的 SQL 查询 外壳脚本,
你可以这样做。
首先,使用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
【讨论】:
应该是这样的:
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;包括二月和闰年)。
【讨论】:
trunc() 不会“删除”时间组件,它只是将其设置为 00:00:00