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(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

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 начинаются по понедельникам, а первая неделя года содержит 4 января этого года. Другими словами, первый четверг года - первая неделя этого года.

В системе нумерации недель ИСО даты начала января могут быть частью 52-й или 53-й недели предыдущего года, а даты конца декабря - частью первой недели следующего года. Например, 2005-01-01 является частью 53-й недели 2004 года, а 2006-01-01 является частью 52-й недели 2005 года, в то время как 2012-12-31 является частью первой недели 2013 года. Рекомендуется использовать поле isoyear вместе с неделей, чтобы получить согласованные результаты.

Другой момент заключается в том, что у вас есть много недель с одним и тем же числом в истории человечества - в этом году, 2017 году, 1970 году и т. Д. У всех них одинаковое число, но очень разные даты. Если это подразумевается - тогда действительно, но, возможно, нет?..

И следующий момент delete * from table where week= week - 3 - этот столбец week является timestamptz? Я надеюсь на это, потому что если нет - как вы определите точное преимущество? Как вы ловите летнее время? и так далее... Итак, если это так, и вы просто хотите сохранить данные за последние три недели КАЛЕНДАРЯ, используйте:

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)
Другие вопросы по тегам