1

嗨,我最近开始探索 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(week from (select 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
4

1 回答 1

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 日。换句话说,一年中的第一个星期四是在该年的第一周。

在 ISO 周编号系统中,1 月初的日期可能是上一年第 52 或 53 周的一部分,而 12 月下旬的日期可能是明年第一周的一部分。例如,2005-01-01 是 2004 年第 53 周的一部分,2006-01-01 是 2005 年第 52 周的一部分,而 2012-12-31 是 2013 年第一周的一部分。建议将 isoyear 字段与 week 一起使用以获得一致的结果。

另一点是,在人类历史上,你有很多周的数字相同——今年、2017 年、1970 年等等,它们都有相同的数字,但日期却大不相同。如果这意味着 - 那么确实,但也许不是?

下一点是delete * from table where week= week - 3- 这个专栏weektimestamptz?我希望如此,因为如果不是 - 你将如何定义确切的边缘?你如何捕捉夏令时开关?依此类推...因此,如果是,并且您只想保留过去三个日历周的数据,请使用:

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)
于 2018-05-30T07:45:46.753 回答