2015-07-09 1 views
1

В моей таблице есть 3 столбца name, start_date и end_date Мне нужно вставить запись в таблицу, только если дата нового события не перекрывает существующее событие. Так, скажем, у меня есть событие с датой 1/1/2015 начала и дату окончания 31.12.2015 я не могу вставить событие, если есть даты, как эти:sql-запрос, чтобы проверить, перекрываются ли 2 события

  • 31/12/2014 - 1/1/2016
  • 2/1/2015 - 30/12/2015
  • 31/12/2014 - 1/6/2015
  • 2/1/2015 - 1/1/2016

Или, говоря об интеграторах:

  • Существующие записи с диапазоном 2 ... 6

Возможные недействительные записи:

  • 1..3
  • 3..5
  • 5..7
  • 1..7

Какое более короткое выражение соответствовать этому условию?

+0

Что RDBMS вы работаете? –

+0

Я использую My Sql – gabric

ответ

3

Любые 2 диапазона перекрываются, если (и только если) первый старт меньше второго конца, тогда как второй старт меньше первого конца.

Поэтому для проверки вашей входящей записи есть дата начала и дата окончания, которая не соответствует этому условию для любой записи в таблице.

Вот наглядное доказательство - все пути две линии могут перекрываться:

1. 
s1|--------|e1 
s2|--------|e2 


2. 
s1|-------|e1 
    s2|--------|e2 


3. 
    s1|--------|e1 
s2|--------|e2 


4. 
s1|-------------------|e1 
    s2|--------|e2 


5. 
    s1|--------|e1 
s2|-------------------|e2 

Как вы можете видеть, s1 всегда меньше, чем e2, в то время как s2 всегда меньше, чем e1.

Это не тот случай, когда две линии не пересекаются:

1. 
s1|--------|e1 
       s2|--------|e2 


2. 
       s1|--------|e1 
s2|--------|e2 

Как вы можете видеть здесь, либо s1 больше, то e2 или s2 больше затем e1.

Тип данных привода совершенно не имеет значения, если он сопоставим.

+0

Я не совсем уверен, что этого условия достаточно, см. Мое обновление в описании вопроса. – gabric

+0

Тип данных не имеет значения, если он сопоставим. –

0

Вы могли бы сделать что-то вроде:

SELECT count(*) FROM tablename 
WHERE :inputDate1 BETWEEN date1 AND date2 
OR :inputDate2 BETWEEN date1 AND date 
OR date1 >= :inputDate1 
OR date2 <= :inputDate2