MySQL: запрос для работы с расписаниями? - PullRequest
2 голосов
/ 31 октября 2011

В проекте, над которым я сейчас работаю, система хранит расписания сотрудников в таблице со следующей структурой:

employee_id | mon_h_s | mon_m_s | mon_h_e | mon_s_e | tue_h_s | tue_m_s | etc.
------------------------------------------------------------------------------
      1         06         00        14        30        06        00     ...
      2         18         30        07        00        21        00     ...

где:

mon_h_s - начало понедельника

mon_m_s - начало понедельника минут

mon_h_e - конец понедельника

mon_m_e - конец понедельника минут

tue_... - вторник ...

Каждый день недели имеет 4 поля: начало часов, начало минут, конец часов, конец минут.

Итак, из приведенной выше таблицы видно, что:

  • сотрудник с id 1 работает с 06: 00 до 14: 30 в понедельник

  • сотрудник с id 2 работает с 18: 30 до 07: 00 в понедельник (в основном, с понедельника по вторник, ночью )

Проблема в том, что я не уверен, как создать запрос SQL, который учитывает все, включая перекрытие времени (в ночное время). Например, нам нужно найти сотрудника, который работает в 6:00 (06:00) во вторник. В нашем случае оба сотрудника (id 1 и id 2) будут удовлетворять этому критерию. Сотрудник с идентификатором 1 начинает свою работу во вторник в 06:00, а сотрудник с идентификатором 2 работает до вторника в 07:00 (хотя начинается в понедельник).

Будем весьма благодарны за любые предложения по решению этой проблемы.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2011

Возможно что-то вроде:

SELECT (1440 + ((mon_h_e*60)+mon_m_e) - ((mon_h_e*60)+mon_m_e)) % 1440

Это даст вам время, отработанное в минутах.По сути, он добавляет 1440 (минут в день или 24 ч * 60 мин / ч) к разнице между временем окончания и временем начала и сохраняет остаток (по модулю) 1440.

Теперь для части проекта:

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

Вам следует подумать об использовании реальных дат.

employee_id | entrytime           | exittime
          1 | 2011-10-31 06:00:00 | 2011-10-31 14:30:00
          1 | 2011-11-01 06:00:00 | null
          2 | 2011-10-31 18:30:00 | 2011-11-01 07:00:00
          2 | 2011-11-01 21:00:00 | null

Таким образом, выиметь:

  1. Полный доступ ко всем функциям даты и времени в MySQL
  2. Простой расчет продолжительности
  3. Простая фильтрация по неполным периодам
0 голосов
/ 31 октября 2011

Есть четыре основных случая, которые вам нужны o обработать

A -> when time of lecture starts before given time
B -> when time of lecture starts after given time but falls within range of ending time
C -> when time of lecture starts within given time but ends after
D -> when time of lecture starts before given time and ends after given time

Теперь это можно выполнить с помощью простых условий ИЛИ

There are four basic cases that u need to handle, A, B,C and D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...