pgAgent根据当前时间戳触发操作

时间:2018-05-30 03:44:29

标签: postgresql-9.5 pgagent

您好我最近开始探索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

1 个答案:

答案 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 - 此列weektimestamptz?我希望如此,因为如果不是 - 你将如何定义确切的边缘?你怎么陷阱夏季时间开关?等等......如果是,并且您只想保留最后三个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)