Как подсчитать отдельные дни из нескольких записей между датами, сгруппированными по неделям

#mysql

#mysql

Вопрос:

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

Этот запрос группируется по неделям, я использую numofdays для определения отработанных дней в течение недели, и у меня есть другие столбцы, которые умножают это значение для вычисления других отчетов.

До недавнего времени это работало нормально, пока я не взял выходной на этой неделе во вторник.

Моя проблема заключается в том, что значение numofdays вычисляется по самым ранним и последним действиям, зарегистрированным за сгруппированную неделю. Это отлично работает, если отпуск был взят в начале или в конце недели, но не на день в середине (с рабочими днями с обеих сторон)

Я думаю, что я хочу сделать, это подсчитать дни, сгруппированные по дням в пределах периода группы.

Если бы я регистрировал действия m, w, t, f, то это вернуло бы 4 для значения numofdays . Затем это делает мой DATEDIFF расчет. ниже пустота.

 SELECT  
    CONCAT(YEAR(start_timedate), '/', WEEK(start_timedate)) AS week_name,
    DATEDIFF(
        max(
            IF(
                end_timedate = '00-00-00 00:00:00',
                NOW(),
                end_timedate
            )
        ),
        min(
            IF(
                start_timedate = '00-00-00 00:00:00',
                NOW(),
                start_timedate
            )
        )
    )   1 numofdays

    FROM timesheet WHERE employee_id = 21 AND yearweek(start_timedate) = yearweek(curdate());

    GROUP BY week_name

ORDER BY
  YEAR(start_timedate) ASC,
  WEEK(start_timedate) ASC;
  

Выше приведена сокращенная версия моего существующего запроса, является ли мой единственный вариант подзапросом здесь?Выглядит как-то некрасиво…

Вот пример одного из способов получения ожидаемого результата с помощью подзапроса и производной таблицы. Я повторяюсь, что заставляет меня чувствовать, что есть лучшие решения для изучения.

 
SELECT  
CONCAT(YEAR(start_timedate), '/', WEEK(start_timedate)) AS week_name,
(
    SELECT  count(*)
        FROM (
        SELECT DAY(start_timedate) 
            FROM timesheet  t
            WHERE t.employee_id = 21
            AND yearweek(start_timedate) = yearweek(curdate())
            GROUP BY DAY(start_timedate)            
        ) working_days
) numofdays

FROM timesheet WHERE employee_id = 21 AND yearweek(start_timedate) = yearweek(curdate())

GROUP BY
  week_name
ORDER BY
  YEAR(start_timedate) ASC,
  WEEK(start_timedate) ASC;
  

Комментарии:

1. Попробуйте оконную функцию (MySQL 8.0) и разделите по дате

2. @DaveStokes Я должен был упомянуть, я использую MySQL 5.6, так что, похоже, это не доступный мне вариант.