MySQL — КОЛИЧЕСТВО рабочих в час

#php #mysql

#php #mysql

Вопрос:

С небольшой (большой) помощью от StackOverflow в прошлом году у меня появилась функция, которая покажет, сколько сотрудников в настоящее время работают.

Код работает нормально, но теперь мы внедрили ночные смены, и исходный запрос показывает только смены, которые начинаются с текущей даты. Люди, работающие в ночные смены, могут зарегистрироваться в 10 вечера и уйти в 8 утра — в текущем запросе они не отображаются, потому что startdate — это день раньше…

Я пытался реализовать enddate в запросе, но безуспешно.

  teamslots
---------
id
startdate
starttime
enddate
endtime

 teamslot_schedule
-----------------
id
slotid (joins to is in teamslots)
userid

 shifthours
----------
thehour
  

Это исходный запрос — мне действительно могла бы пригодиться помощь, которая включила бы в запрос сотрудников, которые находятся на смене, которая начинается накануне, но заканчивается «сегодня».

 SELECT
    DATE_FORMAT(d.startdate   INTERVAL s.thehour HOUR, '%Y-%m-%d %H') AS date,
    COUNT(DISTINCT ts.userid) AS users
FROM
    shifthours s
JOIN
    (SELECT DISTINCT startdate FROM teamslots) d
LEFT JOIN
    teamslots t ON t.startdate = d.startdate AND
        s.thehour BETWEEN HOUR(t.starttime) AND HOUR(t.endtime)
LEFT JOIN
    teamslot_schedule ts ON ts.slotid = t.id
GROUP BY
    d.startdate,
    s.thehour
ORDER BY
    d.startdate   INTERVAL s.thehour HOUR;
  

С наилучшими пожеланиями,
Отметить

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

1. Настройте SQL-скрипку и поделитесь с нами тем, что вы уже пробовали.

2. Как вы решаете, на какой день приходится смена? Основано ли это на enddate ?

3. Маркус : Смена имеет начальную дату время начала И конечную дату время окончания — вместе они указывают промежуток времени, который занимает смена. например. datestart «2014-07-01» время начала «22:00» дата окончания «2014-07-02» время окончания «06:00» — это 8-часовая смена, которая охватывает 2 даты. Этот сдвиг должен учитываться в запросе как для «2014-07-01», так и для «2014-07-02», но только в правильные часовые интервалы. «2014-07-01 22:00 1» «2014-07-01 23:00 1» «2014-07-02 00:00 1» «2014-07-02 01:00 1» «2014-07-02 02:00 1» «2014-07-02 03:00 1» «2014-07-02 04:00 1» «2014-07-02 05:00 1»

4. Таблица «shifthours» содержит только 24 строки от 0 до 23, используемые для объединения за каждый час, необходимый для получения результата.

Ответ №1:

Используйте функцию MySQL CURDATE() и вычтите соответствующий интервал для продолжительности вашей смены.