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