Вы можете использовать extract(isodow FROM <date>)
для извлечения дня недели из date
в виде числа - от 1 для понедельника до 7 для воскресенья. Если вы вычтете на единицу меньше, чем это число дней из date
, у вас есть понедельник недели, в котором находится date
. У вас есть начало недели, и вы можете рассчитать номер своей недели, вычтя разницу между первым дней недели и разделив их на 7. (Вы также можете использовать extract(week FROM <date>)
, чтобы получить номер недели и рассчитать оттуда, но это будет более сложным в разные годы, особенно если в игру вступят и «високосные недели». )
SELECT *,
((current_date - (extract(isodow FROM current_date) - 1 || ' day')::interval)::date
- (created - (extract(isodow FROM created) - 1 || ' day')::interval)::date)
/ 7 + 1 week_number,
(created - (extract(isodow FROM created) - 1 || ' day')::interval)::date first_day_of_week
FROM items
WHERE created > current_date - (extract(isodow FROM current_date) + 7 * (2 - 1) || 'day')::interval
ORDER BY created;
дб <> скрипка
Я изменил предложение WHERE
, поэтому результат привязывается к целой неделе, а не к кратному семи дням. Если вы не хотите этого, замените его старым предложением WHERE
. Если вы хотите сохранить мое предложение WHERE
, вы можете изменить (N - 1)
на N
, если текущая неделя не засчитывается. В этом случае вы также можете удалить + 1
из расчета номера недели, чтобы текущая неделя получила число 0.