как подсчитать количество дней недели и выходных в течение нескольких месяцев?

#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. @Макс Да, ты мог бы сделать это таким образом. Это вопрос стиля и выбора.