У меня есть следующие данные;
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.
Запрос для выбора перекрытий (я бы назвал столбцы startTime & endTime, хотя время кажется важным …):
WHERE <start> < endDate AND <end> > startDate
Это, вероятно, не самый лучший метод, но, может быть, вы можете прочесть что-то из этого примера. Это вернет результат только в том случае, если они будут перекрываться, и я, вероятно, использовал бы это в запросе, который 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')
Ответ Per Wrikken, вероятно, вам нужно проверить, что значения не являются точными совпадениями.
Перекрывающиеся записи:
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)