#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, так что, похоже, это не доступный мне вариант.