Пересекающийся диапазон дат MySQL - PullRequest
1 голос
/ 08 сентября 2010

У меня есть следующие данные;

ID  startDate               endDate
-----------------------------------------------
1   2010-03-01 10:00:00     2010-03-01 12:00:00
2   2010-03-01 12:30:00     2010-03-01 15:30:00
3   2010-03-01 15:30:00     2010-03-01 18:30:00

Что я хочу сделать, это убедиться, что даты начала и окончания не попадают в диапазоны startDate и endDate в моих данных.

Так, например, следующее будет в порядке;

startDate               endDate
-----------------------------------------------
2010-03-01 12:00:00     2010-03-01 12:30:00
2010-03-01 18:30:00     2010-03-01 21:00:00

но следующие даты потерпят неудачу, поскольку они будут перекрываться;

startDate               endDate
-----------------------------------------------
2010-03-01 09:00:00     2010-03-01 13:00:00 (overlaps ID 1)
2010-03-01 10:30:00     2010-03-01 11:00:00 (overlaps ID 1)
2010-03-01 18:00:00     2010-03-01 19:00:00 (overlaps ID 3)

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

Я использую MySQL.

Ответы [ 3 ]

7 голосов
/ 08 сентября 2010

Запрос на выбор перекрытий (хотя я бы назвал столбцы startTime и endTime, поскольку время кажется важным ...):

WHERE 
<start> < endDate
AND
<end> > startDate
0 голосов
/ 08 сентября 2010

Перекрывающиеся записи:

SELECT t1.Id, t2.Id, t1.StartDate, t1.EndDate, t2.StartDate, t2.EndDate
FROM Table t1, Table t2
WHERE t1.ID <> t2.Id
AND (t1.StartDate between t2.StartDate and t2.EndDate
    OR
     t1.EndDate between  t2.StartDate and t2.EndDate)
0 голосов
/ 08 сентября 2010

Вероятно, это не самый лучший метод, но, возможно, вы можете что-то просветить из этого примера.Это вернет результат, только если они перекрываются, и я, вероятно, использовал бы это в запросе not exists.

select 1 from myTable
where 
('03/01/2010 09:00:00' between startDate and endDate)
or
('03/01/2010 13:00:00' between startDate and endDate)
or 
(startDate between '03/01/2010 09:00:00' and '03/01/2010 13:00:00')
or
(endDate between '03/01/2010 09:00:00' and '03/01/2010 13:00:00')

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

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