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

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)).
является ли такое условие правильным и оптимальным ???
 

neko

tеam neko
я так понял ты считаешь случаи когда оно пересекается?

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

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

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

Winer

Мимо проходил
мда, совсем не понятно, буду думать.

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

neko

tеam neko
btw обрати внимание что BETWEEN это <=

т.е. у тебя могут заказы "зацепиться краями" :)
но т.к. я незнаю что тебе нужно....
 

Найч

Алгоритмик :-)
Winer
А можно ли наложить дополнительное условие, что начало нового заказа всегда больше начала предыдущего?
 

Winer

Мимо проходил
neko
да, могут, но это вроде не страшно, т.е. один кончился и тут же начался другой, т.е. нормально.
долго над твоим условием думал, долго не вьезжал, пока не привёл к виду
where((order_end>=$order_start) AND (order_start<=$order_end)).
всё работает нормально, спасибо :).

-~{}~ 17.05.04 00:32:

хотя на сознательном уровне всё равно не вьехал до конца, больше интуитивно :(
Найч
больше-равно, но зачем ???
 

Найч

Алгоритмик :-)
Winer
Тогда единственная проверка - $begin нового>end последнего :)
 

Winer

Мимо проходил
Найч
видимо не совсем понятно объяснил :)
мне надо найти количество уже существующих заказов, тем или иным образом пересекающихся с новым заказом.
 

Найч

Алгоритмик :-)
нужно, чтобы новый заказ не наложился по времени на уже имеющиеся
мне надо найти количество уже существующих заказов, тем или иным образом пересекающихся с новым заказом.
Да... разные вещи, не так ли?
 

Найч

Алгоритмик :-)
Ладно.
Тогда
SELECT count(id_order) FROM orders WHERE
$order_start<order_end
Выведет тебе количество заказов, пересекающиеся с тем, который начинается с $order_start.
Но в том случае, если начало нового заказа всегда >= начала предыдущего
 

Winer

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

Найч

Алгоритмик :-)
Winer
ТО ты говоришь, что
нужно, чтобы новый заказ не наложился по времени на уже имеющиеся
потом
мне надо найти количество уже существующих заказов, тем или иным образом пересекающихся с новым заказом
Ладно, проехали...
Но я тебя спросил
А можно ли наложить дополнительное условие, что начало нового заказа всегда больше начала предыдущего?
Ты ответил
Сечас говоришь, что
может оказаться свободный промежуток, такой что в него новый заказа влазит и новый заказ начинаеться раньше уже существующего
Меня обламывает что-то дальше думать, если ты сам не хочешь, чтоб тебе помогли.
Удачи!
 
Сверху