pgAgent для запуска действия на основе текущей отметки времени - PullRequest
0 голосов
/ 30 мая 2018

Привет, я недавно начал изучать 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 Ответ

0 голосов
/ 30 мая 2018

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

В системе нумерации ИСО по ISO даты начала января могут быть частью 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)
...