#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 утра):
- вы проверяете, кто начинает свою деятельность в 6 утра, для каждого начального действия вы устанавливаете значение true для соответствующего флага
- если для всех флагов установлено значение true, то здесь у вас есть начальный диапазон перекрытия, в противном случае, если диапазон перекрытия продолжался, остановите его
- увеличить время на 30 минут
- для каждого начального действия сотрудника установите его флаг в true
- для каждого конечного действия сотрудника установите его флаг на false
- вернитесь к шагу 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