Получите эту неделю понедельника в Postgres?

Как я могу получить эту дату в понедельник на PostgreSQL?

Например, сегодня 01/16/15 (пятница). На этой неделе понедельная дата - 01/12/15.

Ответ 1

SELECT current_date + cast(abs(extract(dow from current_date) - 7) + 1 as int);

работает, хотя могут быть более элегантные способы сделать это.

Общая идея - получить текущий день недели, dow, вычесть 7 и взять абс, который даст вам количество дней до конца недели и добавит 1, чтобы добраться до Понедельник. Это даст вам следующий понедельник.

EDIT: совершенно неверный вопрос, чтобы получить предыдущий понедельник, намного проще:

SELECT current_date - cast(extract(dow from current_date) as int) + 1;

т.е. вычесть текущий день недели с сегодняшней даты (число дневного пути в понедельник) и добавить один, чтобы вернуться в понедельник.

Ответ 3

Обычно я использую таблицу календаря . Существуют два основных преимущества.

  • Простой. Младшие разработчики могут запросить его правильно с небольшой подготовкой.
  • Очевидное. Правильные запросы, очевидно, правильны.

Предполагая, что "на этой неделе в понедельник" означает понедельник до сегодняшнего дня, если сегодня не понедельник.,.

select max(cal_date) as previous_monday
from calendar
where day_of_week = 'Mon' 
  and cal_date <= current_date;