Как получить номер недели за последние N дней в PostgreSQL? - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть таблица предметов, которая содержит поле даты created. Я хотел бы просмотреть заказы за последние N недель и выполнить запрос SELECT, который может сказать мне, на какой неделе был создан элемент.

Например, что-то вроде:

SELECT *,
WEEK_START(created) as week_beginning,
WEEK_NUMBER(created) as week_number
FROM items
WHERE created > current_date - N * 7  ## look at last N weeks only

Я ожидал бы те же столбцы, но теперь, кроме того, у меня будет столбец week_number и week_beginning в диапазоне от 1 до N, где N - последняя неделя, а week_beginning сообщит мне время начала недели.

1 Ответ

0 голосов
/ 02 сентября 2018

Вы можете использовать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...