Получить перекрывающийся временной диапазон с условиями

#java #sql #database #hibernate

#java #sql #База данных #спящий режим

Вопрос:

Я пытаюсь создать планировщик задач, но столкнулся с проблемой, которая не знает, что делать или как решить: S

Я постараюсь объяснить как можно лучше. дана таблица, подобная следующей:

 key | start |  end  | employee(fk) 
 1    6:00    8:00     A               
 2    9:00    11:00    B
 3    7:00    9:00     B
 4    7:00    11:00    C
 

на изображении

что я хочу найти, так это то, что, учитывая набор из N сотрудников, верните мне весь перекрытый временной диапазон этими данными сотрудниками. это похоже на получение строки «AND’ed» для заданных сотрудников. (или, другими словами: получить весь временной диапазон, в котором работают все данные сотрудники)

Пример:

 given {A,B}   returns 2 columns 7:00  |  8:00  time range which overlaped by A and B
given {B,C}  returns  2 columns 9:00  |  11:00  time range which overlaped by B and C
 

Я думал 3 дня и до сих пор не очень ясно представляю, что делать … может кто-нибудь мне помочь?

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

1. Какая степень детализации вам нужна? Полчаса? Час? Одна минута?

2. полчаса будет хорошо, но это на что-то влияет?

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

Ответ №1:

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

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

Затем вы переходите с шагом в 30 минут (предположим, с 6 утра):

  1. вы проверяете, кто начинает свою деятельность в 6 утра, для каждого начального действия вы устанавливаете значение true для соответствующего флага
  2. если для всех флагов установлено значение true, то здесь у вас есть начальный диапазон перекрытия, в противном случае, если диапазон перекрытия продолжался, остановите его
  3. увеличить время на 30 минут
  4. для каждого начального действия сотрудника установите его флаг в true
  5. для каждого конечного действия сотрудника установите его флаг на false
  6. вернитесь к шагу 2

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

1. но не слишком ли много проверок процесса каждые 30 минут? поскольку я не хочу получать только временной диапазон в один день, мне нужен временной диапазон как минимум в 3 месяца или 1 год, если это возможно.

2. Вам обязательно нужно будет изучить все действия. Манипулируя данными напрямую, это было бы легко: просто держите их отсортированными, чтобы вы действительно извлекали их в правильном порядке без необходимости выполнять шаги по 30 минут (вы будете извлекать каждый раз, когда кто-то запускает или останавливает действие), но с запросами я не думаю, что есть быстрый способ. Вам действительно нужно выполнить сложную операцию.

Ответ №2:

Посмотрите, решает ли это проблему в псевдо-SQL (я использую домашнюю базу ДАННЫХ моей компании, поэтому используйте наш синтаксис SQL). Предполагая, что имя таблицы «Таблица» :

 SELECT T1.employee, T2.employee, T1.start, T2.end 
FROM Table T1, Table T2 
WHERE T1.key!=T2.key AND T1.employee!=T2.employee 
      AND T1.start <= T2.end AND T1.start >= T2.start