在PostgreSQL中,我想创建一个脚本,它可以从A表(包含很多行)中删除1个月之前的旧数据,并将此数据插入到一个新的别名表中。我想每月执行这个脚本。
因为我创建了脚本
insert into B select * from A where date >(now-'30 day'::interval);
delete from A where date <(now()-'30 days.
但是在某个月有30天,在31天左右。所以如何在cron选项卡中设置它以删除确切的数据并移入别名表。
答案 0 :(得分:0)
每个月的第一天运行它并按如下方式编写:
... WHERE date >= date_trunc('month', current_timestamp) - INTERVAL '1 month'
AND date < date_trunc('month', current_timestamp)
如果您的表包含大量数据,您可能需要查看分区。
答案 1 :(得分:0)
虽然Laurenz的回答很有意义,似乎很好地猜测了OP真正想要的东西(cron月度可能意味着他想要冲洗“不是一个月”,而是“上个月”所以date_trunc
到月是一个案例)
然而另一种方式回答它(据我理解原帖):
begin;
insert into B select * from A where date >(now()-'1 month'::interval);
delete from A where date <(now()-'1 month'::interval);
end;
将删除上个月的所有数据,但不会删除一个月前的相同时间戳,例如:
t=# select now()-'1 month'::interval;
?column?
-------------------------------
2017-05-12 07:31:31.785402+00
(1 row)
根据这个逻辑,您可能希望每天安排此数据清除,而不是每月安排 - 将上个月的数据保留在活动表中,而不是“最多两个”直到cron fires ......