интервал, пересекающийся(входящий) с/в другим интервалом

  • Автор темы Автор темы Winer
  • Дата начала Дата начала

Winer

Мимо проходил
интервал, пересекающийся(входящий) с/в другим интервалом

есть таблица: id_order | order_start | order_end.
и есть две переменные, тоже $order_start,$order_end.
т.е. храняться время начала и конца заказа.
нужно, чтобы новый заказ не наложился по времени на уже имеющиеся, т.е. чтобы, например время начала нового заказа не оказалось между временем начала и конца уже имеющегося заказа, и т.д.
для этого делаю запрос "SELECT count(id_order) FROM orders WHERE(($order_start BETWEEN order_start AND order_end)OR($order_end BETWEEN order_start AND order_end))"
результаты вроде бы правильные, действительно ли запрос правилен ??? и нельзя ли условие как-то сократить ???

-~{}~ 16.05.04 23:23:

да, оказалось неправильно :( после размышлений получилось
WHERE(($order_start BETWEEN order_start AND order_end) OR (order_start BETWEEN $order_start AND $order_end)).
является ли такое условие правильным и оптимальным ???
 
я так понял ты считаешь случаи когда оно пересекается?

можно так сделать

where !( ($order_start > order_end) || ($order_end < order_start) )

правда это несильно короче и куда менее понятно
зачем сокращать вообще?
 
мда, совсем не понятно, буду думать.

собственно -
является ли такое условие правильным и оптимальным ???
насчёт правильности уже почти не сомневаюсь, а вот насчёт оптимальности....
 
btw обрати внимание что BETWEEN это <=

т.е. у тебя могут заказы "зацепиться краями" :-)
но т.к. я незнаю что тебе нужно....
 
Winer
А можно ли наложить дополнительное условие, что начало нового заказа всегда больше начала предыдущего?
 
neko
да, могут, но это вроде не страшно, т.е. один кончился и тут же начался другой, т.е. нормально.
долго над твоим условием думал, долго не вьезжал, пока не привёл к виду
where((order_end>=$order_start) AND (order_start<=$order_end)).
всё работает нормально, спасибо :).

-~{}~ 17.05.04 00:32:

хотя на сознательном уровне всё равно не вьехал до конца, больше интуитивно :(
Найч
больше-равно, но зачем ???
 
Winer
Тогда единственная проверка - $begin нового>end последнего :)
 
Найч
видимо не совсем понятно объяснил :)
мне надо найти количество уже существующих заказов, тем или иным образом пересекающихся с новым заказом.
 
нужно, чтобы новый заказ не наложился по времени на уже имеющиеся
мне надо найти количество уже существующих заказов, тем или иным образом пересекающихся с новым заказом.
Да... разные вещи, не так ли?
 
Ладно.
Тогда
SELECT count(id_order) FROM orders WHERE
$order_start<order_end
Выведет тебе количество заказов, пересекающиеся с тем, который начинается с $order_start.
Но в том случае, если начало нового заказа всегда >= начала предыдущего
 
да нет, не подходит, может оказаться свободный промежуток, такой что в него новый заказа влазит и новый заказ начинаеться раньше уже существующего.
а вообще-то where((order_end>=$order_start) AND (order_start<=$order_end)) вполне устраивает :)
не думаю, что будет вариант лучше.
 
Winer
ТО ты говоришь, что
нужно, чтобы новый заказ не наложился по времени на уже имеющиеся
потом
мне надо найти количество уже существующих заказов, тем или иным образом пересекающихся с новым заказом
Ладно, проехали...
Но я тебя спросил
А можно ли наложить дополнительное условие, что начало нового заказа всегда больше начала предыдущего?
Ты ответил
Сечас говоришь, что
может оказаться свободный промежуток, такой что в него новый заказа влазит и новый заказ начинаеться раньше уже существующего
Меня обламывает что-то дальше думать, если ты сам не хочешь, чтоб тебе помогли.
Удачи!
 
Сверху