#sql #postgresql
Вопрос:
У меня есть следующий запрос, в котором мне нужно посчитать будние и выходные дни для следующих месяцев
SELECT fname, MONTH(eventDate), SUM(IF(WEEKDAY(eventDate) lt; 5,1,0)) AS WeekdayCount, SUM(IF(WEEKDAY(eventDate) gt;= 5,1,0)) AS WeekendCount FROM eventcal AS e LEFT JOIN users AS u ON e.primary = u.username GROUP BY fname, MONTH(eventDate);
Но у меня проблема с меткой времени, и я получаю это
(Postgrex.Error) ERROR 42883 (undefined_function) function weekday(timestamp without time zone) does not exist
так как у меня есть дата события, которая является отметкой времени для inserted_at. Он не может выполнить запрос по этому вопросу. Что мне делать?
неужели в postgres нет этой функции?
что может быть альтернативой этому в Postgres?
Ответ №1:
Используйте EXTRACT
с частью даты isodow
. Это возвращает значение от 1 до 7 для периода с понедельника по воскресенье.
SELECT u.fname, MONTH(e.eventDate), COUNT(*) FILTER (WHERE EXTRACT(idodow FROM e.eventDate) lt; 6) AS WeekdayCount, COUNT(*) FILTER (WHERE EXTRACT(idodow FROM e.eventDate) IN (6, 7)) AS WeekendCount, FROM users u LEFT JOIN eventcal e ON e.primary = u.username GROUP BY u.fname, MONTH(e.eventDate);
Обратите также внимание, что соединение слева от users
eventcal
таблицы, по-видимому, имеет здесь наибольший смысл, а не наоборот.
Комментарии:
1.
COUNT(*) FILTER (WHERE EXTRACT(idodow FROM e.eventDate) gt;= 6 AS WeekendCount
на выходные мы тоже можем это написать, верно?2. @Макс Да, ты мог бы сделать это таким образом. Это вопрос стиля и выбора.