【问题标题】:pgAgent to trigger action based on current timestamppgAgent 根据当前时间戳触发动作
【发布时间】:2018-05-30 15:51:36
【问题描述】:

嗨,我最近开始探索 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

【问题讨论】:

  • 创建或替换函数 weekno() 返回 void AS $$ DECLARE weekno INTEGER; BEGIN weekno := select extract(week from (select current_timestamp)); RAISE NOTICE '%', weekno;结尾; $$ 语言 plpgsql;选择周号(); @Vao Tsun 很抱歉给您带来不便,我无法在此示例中包含任何空格或 Enter
  • 这是我在 SQL 端的方法,但也许窗口批处理脚本也可以做类似的事情。这就是为什么我没有在问题中包含代码的原因,因为我对 SQL 和窗口批处理文件方法都持开放态度。获得周数后,我可以从包含周数数据的表中删除行 - 3
  • @VaoTsun 帖子已被编辑,请参考编辑后的帖子,这可以在 linux crontab 中轻松完成,但是对于 pgAgent,我对如何做到这一点有点困惑。

标签: postgresql-9.5 pgagent


【解决方案1】:

假设星期从星期日开始,那么要获取第 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?我希望如此,因为如果不是 - 你将如何定义确切的边缘?你如何捕捉夏令时开关?依此类推...因此,如果是,并且您只想保留过去三个日历周的数据,请使用:

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)

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多