Здравствуйте уважаемые жители страны ЛОР!
Есть некоторая задачка, к которой я пока не пойму как подступиться...
Немного терминологии
Интервал - это некая запись в «БД» имеющая два свойства: дата/время начала и дата/время окончания:
2012-09-05 12:34:08 - 2012-09-05 15:07:33
«БД» в кавычках, потому что пока нет никакой определённости будет ли она в реальности СУРБД или плоским файлом или еще чем. В каком формате записывается дата/время, всё в тумане.
Пока я только экспериментирую, и сделал табличку в MySQL где есть три поля: intervalID (autoincrement), intervalStart (unixtime) и intervalStop (unixtime).
Немного рассуждений
Есть (точнее её еще нет) некая программа, которая учитывает интервалы времени.
Внутри сидит дядька с таймером и получает извне две возможные команды (некие события): «включить таймер» и «выключить таймер». Таймер у дядьки один. Т.е. если к нему поступила команда «включить таймер», он его включает и ждет противоположной команды. Выполнить повторно команду «включить таймер» он не может и в случае ее подачи - проигнорирует.
В течении некоего времени этот дядька может учесть несколько интервалов. Он записывает эти интервалы в базу. Дядька очень строгий и никогда не позволит чтобы учитываемые интервалы наложились друг на друга полностью или частично.
Представим, что программа работает, а дядька усердно исполняет свои функции, запускает и останавливает таймер строго по событиям. В результате в БД оказывается множество записей хранящих интервалы времени.
Выглядит это примерно так:
...
218 - 2012-09-03 01:34:08 - 2012-09-03 01:42:31
219 - 2012-09-03 01:54:12 - 2012-09-03 01:59:42
220 - 2012-09-03 02:18:22 - 2012-09-03 02:25:21
221 - 2012-09-03 02:27:03 - 2012-09-03 04:41:13
222 - 2012-09-03 06:45:58 - 2012-09-03 06:46:22
...
Обратите внимание, интервалы могут быть самыми разнообразными, короткими или длинными, начинаться и завершаться в произвольные моменты времени, и между ними могут быть неучтённые промежутки разной длительности. Одно условие, логика работы программы построена так, что они никогда не наезжают друг на друга, никогда не пересекаются.
Например. Если предыдущий интервал времени закончился в 2012-09-03 02:25:21, то следующий не может начаться в 2012-09-03 02:24:01. Ну вот, вроде объяснил, и даже сам понял что объяснял :)
Теперь собственно сложный момент
Однако, возможна ситуация, когда дядька с таймером не выполнил свою работу. То ли он не получил команды, то ли обленился... Однако возникла необходимость внести в базу некий интервал «задним числом». Это будет делать тётя Маша - пользователь. Для тёти Маши будет подготовлен красочный и функциональный интерфейс, где она посредством несложных манипуляций мыши и/или клавиатуры сможет ввести новый интервал задав точки его начала и окончания.
Конечно тёте Маше будет показано, какие интервалы в базе существуют на данный момент. Править эти интервалы тётя Маша не умеет, не хочет и страшно боится. Но записать новый интервал - это всегда пожалуйста.
Однако, тётя Маша человек, и ей, как и всем нам свойственны ошибки.
Необходимо проконтролировать работу тёти Маши. И ни в коем случае не позволить ей ввести новый интервал, который бы каким-либо образом пересекся (наложился) с уже имеющимся интервалом. Тётя Маша может вводить только интервалы, которые лягут строго между двумя соседними по времени.
Конечно было бы интересно найти решение в виде SQL-запроса. Но подойдут и любые другие варианты. Например можно выбрать из базы все варианты одного дня с вводимым интервалом и произвести валидацию каким-нибудь хитрым алгоритмом. Пока рассматриваю способы не учитывающие возможность множественной правки базы, т.е. если с программой одновременно решили воспользоваться тётя Маша, тётя Даша и новенькая девушка Ира :) Пусть, условно, тётя Маша единственный и неповторимый пользователь.
Собственно вопрос
Какие могут быть варианты валидации вводимого интервала на предмет пересечения с имеющимися в базе?
Рассматриваем любые варианты, от идеального до самых безумных :)
P.S.: Прошу прощения за многословность. Эта задачка вращается у меня в фоне уже некоторое время, а взяться за нее всерьез никак не могу, вариантов вроде не нащупал дельных. Видимо она там в подсознании уже произвела некоторую свалку. Выговорился и легче стало, как будто на кушетке у психолога побывал :)
P.P.S.: Кстати, вроде кое-что придумал в процессе. Надо будет проверить, если получится - отпишусь.