Разделить перекрывающиеся даты на разные записи

Я разрабатываю приложение PHP + MySQL. У меня есть таблица, которая содержит дату начала и дату окончания периодов. Периоды могут пересекаться. Пример:

ID   Start       End
1    01/05/2015  31/05/2015
2    01/06/2015  30/06/2015
3    15/06/2015  25/06/2015 (this record overlaps record with ID 2)
4    17/06/2015  22/06/2015 (this record overlaps records with IDs 2 and 3)

Мне нужно выбрать все записи, упорядочить по дате начала и дате окончания, а также разделить перекрывающиеся записи и сохранить их идентификаторы. Я имею в виду, что мне нужно получить это в конце:

ID   Start       End
1    01/05/2015  31/05/2015
2    01/06/2015  14/06/2015
3    15/06/2015  16/06/2015
4    17/06/2015  22/06/2015
3    23/06/2015  25/06/2015
2    26/06/2015  30/06/2015

Я могу сделать это, выбрав все периоды, а затем отсортировав/разделив их в PHP, но мне интересно, могу ли я сделать это на уровне базы данных?

Может кто-нибудь хотя бы указать мне правильное направление, пожалуйста?


person Andy    schedule 19.08.2015    source источник


Ответы (1)


Я думаю, вы должны сделать это PHP (или, может быть, процедуру db, но я бы не стал делать это на уровне db), это будет проще. Есть много комбинаций, которые вы должны учитывать, и они не могут вписаться в один оператор SQL.

Вот пример того, как обнаружить перекрытия (по крайней мере, так я могу вам помочь):

SELECT  t1.id, t1.start, t1.id, t2.id
FROM    T t1, T t2
WHERE   (t2.start BETWEEN t1.start AND t1.end
        OR t2.end BETWEEN t1.start AND t1.end)
        AND t2.id > t1.id

ДЕМО ЗДЕСЬ

person Michał Szkudlarek    schedule 19.08.2015
comment
Я хотел бы держаться подальше от процедур БД, так как их слишком сложно отлаживать, если я столкнусь с некоторыми ошибками. Думаю, мне придется пойти по пути PHP - person Andy; 20.08.2015
comment
Точно, я тоже не любитель отлаживать процедуры БД. Таким образом, прикладной уровень кажется лучшим подходом. - person Michał Szkudlarek; 20.08.2015