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)