您好我最近开始探索pgAgent。安装和测试已经完成。然而,有一件事让我困扰pgAgent。该东西只会运行SQL或批处理代码。
假设,在我的数据库表中包含不同的周数数据。出于维护目的,该表应仅存储过去2周的数据。 pgAgent是否能够完成此任务的自动化。
工作流程将是:
1)Get System timestamp
2)Calculate week Number
3)delete * from table where week= week - 3
如果可以这样做,它会在批处理还是SQL类上?如果你能提供一些例子,我非常感谢。
非常感谢你。
CREATE OR REPLACE FUNCTION weekno() RETURNS void AS $$
DECLARE weekno INTEGER;
BEGIN
weekno := select extract(week from (select current_timestamp));
RAISE NOTICE '%', weekno;
END;
$$ LANGUAGE plpgsql;
SELECT weekno();
delete * from mytable where week=weekno();
示例,假设select extract(from(from current_timestamp))返回22,则必须删除包含第19周数据的行。
Week Person Total Overtime Hours
19 Belle 12
19 Anthony 10
19 Boss 0
20 Anthony 15
20 Boss 0
20 Belle 5
21 Anthony 20
21 Belle 10
21 Boss 0
22 Anthony 25
22 Belle 8
22 Boss 0
答案 0 :(得分:0)
假设周在星期日开始,然后要获得周数x的行,您需要:
t=# select now() - concat(extract(dow from now()),' days')::interval - '3 weeks'::interval;
?column?
-----------------------------
2018-05-06 07:36:33.2053+00
(1 row)
为什么这样,而不是week number -3
?因为一年中的一周可能意味着非常不同的事情:
https://www.postgresql.org/docs/current/static/functions-datetime.html
周
一年中ISO 8601周编号周数。通过 定义,ISO周从星期一开始,一年的第一周开始 包含那一年的1月4日。换句话说,第一个星期四 一年是在那一年的第1周。
在ISO周编号系统中,可能在1月初 日期是上一年的第52周或第53周的一部分,并且 12月下旬的日期将成为明年第一周的一部分。 例如,2005-01-01是2004年第53周的一部分,并且 2006-01-01是2005年第52周的一部分,而2012-12-31是 2013年第一周的一部分。建议使用isoyear 与周一起获得一致的结果。
另一点是,你有足够多的星期与人类历史相同的数字 - 今年,2017年,1970年等所有他们有相同的数字,但日期不同。如果这意味着 - 那么确实,但也许不是吗?..
下一点是delete * from table where week= week - 3
- 此列week
是timestamptz
?我希望如此,因为如果不是 - 你将如何定义确切的边缘?你怎么陷阱夏季时间开关?等等......如果是,并且您只想保留最后三个CALENDAR周的数据,请使用:
delete * from table
where week <= (now() - concat(extract(dow from now()),' days')::interval - '3 weeks'::interval);
<强>更新强> 现在,当你最终发布数据样本时,我可以在没有理论猜测的情况下提出建议:
delete * from table
where week = extract(week from now() - '3 weeks'::interval);
再一次 - 您需要间隔时间来进行年度边缘的正确计算:
t=# select extract(week from '2018-01-08'::date - '3 weeks'::interval), extract(week from '2018-01-08'::date);
date_part | date_part
-----------+-----------
51 | 2
(1 row)
针对:
t=# select extract(week from '2018-01-08'::date) - 3 , extract(week from '2018-01-08'::date);
date_part | ?column?
-----------+----------
-1 | 2
(1 row)