Временной промежуток
От: Dmitry Pyatkov  
Дата: 06.05.04 04:09
Оценка:
Есть таблица типа:

CREATE TABLE rorder
(
  `id_order` INT NOT NULL auto_increment,
  `begin_time` TIME,
  `end_time` TIME,
   PRIMARY KEY(`id_order`)
);


Как сделать запрос выводящий заказы не входящие в промежуток времени `begin_time` и `end_time`.
Т.е типа
SELECT id_order FROM rorder WHERE [хрю му]


ПОМОГИТЕ ГОРЮ! ПЛИЗ!
Re: Временной промежуток
От: Dmitry Pyatkov  
Дата: 06.05.04 04:27
Оценка:
Чуть не забыл. База mysql. Промежуток может частично входить как слева так и справа.
Re[2]: Временной промежуток
От: Johnmen  
Дата: 06.05.04 05:43
Оценка: 2 (1)
SELECT id_order FROM rorder WHERE <время заказа> NOT BETWEEN begin_time AND end_time
Re[3]: Временной промежуток
От: Dmitry Pyatkov  
Дата: 06.05.04 05:47
Оценка:
Здравствуйте, Johnmen, Вы писали:

J>SELECT id_order FROM rorder WHERE <время заказа> NOT BETWEEN begin_time AND end_time


Это понятно, но нето. (всёравно спасибо за ответ)
Промежутки могут пересекаться как слева так и справа, т.е. раньше начинаться , позже заканчиваться. Такие тоже надо проверять.
Re[4]: Временной промежуток
От: KGP http://kornilow.newmail.ru
Дата: 06.05.04 06:04
Оценка:
Здравствуйте, Dmitry Pyatkov, Вы писали:

J>>SELECT id_order FROM rorder WHERE <время заказа> NOT BETWEEN begin_time AND end_time

SELECT id_order FROM rorder WHERE (<начальная дата> BETWEEN begin_time AND end_time)
or (<конечная дата> BETWEEN begin_time AND end_time)
... << RSDN@Home 1.1.2 stable >>
Re[5]: Временной промежуток
От: KGP http://kornilow.newmail.ru
Дата: 06.05.04 06:08
Оценка:
Здравствуйте, KGP, Вы писали:

KGP>Здравствуйте, Dmitry Pyatkov, Вы писали:


Упс ... не входящий
KGP>SELECT id_order FROM rorder WHERE <конечная дата> > begin_time)
KGP> or (<начальная дата> > end_time)
... << RSDN@Home 1.1.2 stable >>
Re[5]: Временной промежуток
От: Dmitry Pyatkov  
Дата: 06.05.04 06:12
Оценка:
Здравствуйте, KGP, Вы писали:

KGP>SELECT id_order FROM rorder WHERE (<начальная дата> BETWEEN begin_time AND end_time)

KGP> or (<конечная дата> BETWEEN begin_time AND end_time)

Да так оно так, да не так.
В смысле временой промежуток может наченаться раньше проверяемого и кончаться позже.
Re[6]: Временной промежуток
От: g_i  
Дата: 06.05.04 07:02
Оценка:
Здравствуйте, Dmitry Pyatkov, Вы писали:

DP>Здравствуйте, KGP, Вы писали:


KGP>>SELECT id_order FROM rorder WHERE (<начальная дата> BETWEEN begin_time AND end_time)

KGP>> or (<конечная дата> BETWEEN begin_time AND end_time)

DP>Да так оно так, да не так.

DP>В смысле временой промежуток может наченаться раньше проверяемого и кончаться позже.

Ты ж скажи, что тебе надо-то, по русски! У тебя есть dt_Start и dt_End.
Какие ордера должны стать результатом выполнения запроса? Никак не задевающие указанный интервал? Или только не лежащие в нем целиком?
Re[7]: Временной промежуток
От: Dmitry Pyatkov  
Дата: 06.05.04 07:04
Оценка:
Здравствуйте, g_i, Вы писали:

g_i>Ты ж скажи, что тебе надо-то, по русски! У тебя есть dt_Start и dt_End.

g_i>Какие ордера должны стать результатом выполнения запроса? Никак не задевающие указанный интервал? Или только не лежащие в нем целиком?

Ни как не входящие в промежеток.
Re[8]: Временной промежуток
От: g_i  
Дата: 06.05.04 07:10
Оценка: 1 (1)
Здравствуйте, Dmitry Pyatkov, Вы писали:

g_i>>Какие ордера должны стать результатом выполнения запроса? Никак не задевающие указанный интервал? Или только не лежащие в нем целиком?


DP>Ни как не входящие в промежеток.


Вхождение — это когда лежит в интервале целиком, не выходя за его границы.
И еще раз уточняем. Условиям удовлетворяют ордера срок действия которых никак не пересекается с искомым интервалом или все-же не лежащие в этом интервале целиком?.

Давай на примере. Интервал (01.01.2004;10.01.2004)
ордер 1 (01.01.2004;05.01.2004)
ордер 2 (01.01.2004;15.01.2004)
ордер 3 (30.12.2003;15.01.2004)
ордер 4 (12.01.2004;15.01.2004)
Какие из этих ордеров удовлетворяеют твоим условиям (должны быть в результатах запроса?
Re[9]: Временной промежуток
От: Dmitry Pyatkov  
Дата: 06.05.04 07:17
Оценка:
Здравствуйте, g_i, Вы писали:

DP>>Ни как не входящие в промежеток.

g_i>Вхождение — это когда лежит в интервале целиком, не выходя за его границы.
g_i>И еще раз уточняем. Условиям удовлетворяют ордера срок действия которых никак не пересекается с искомым интервалом или все-же не лежащие в этом интервале целиком?.

Нужно вывести всех кто частично касается либо полностью входит в интервал.

g_i>Давай на примере. Интервал (01.01.2004;10.01.2004)

g_i>ордер 1 (01.01.2004;05.01.2004)
выводим
g_i>ордер 2 (01.01.2004;15.01.2004)
выводим
g_i>ордер 3 (30.12.2003;15.01.2004)
выводим
g_i>ордер 4 (12.01.2004;15.01.2004)
не выводим
g_i>Какие из этих ордеров удовлетворяеют твоим условиям (должны быть в результатах запроса?
Re[10]: Временной промежуток
От: g_i  
Дата: 06.05.04 07:32
Оценка: 3 (1)
Здравствуйте, Dmitry Pyatkov, Вы писали:

DP>Нужно вывести всех кто частично касается либо полностью входит в интервал.


g_i>>Давай на примере. Интервал (01.01.2004;10.01.2004)

g_i>>ордер 1 (01.01.2004;05.01.2004)
DP>выводим
g_i>>ордер 2 (01.01.2004;15.01.2004)
DP>выводим
g_i>>ордер 3 (30.12.2003;15.01.2004)
DP>выводим
g_i>>ордер 4 (12.01.2004;15.01.2004)
DP>не выводим

Если гарантируется, что end_time >= begin_time, тогда

SELECT id_order FROM rorder WHERE NOT (end_tyme < :DT_START OR begin_time > :DT_END)
Re[11]: Временной промежуток
От: Dmitry Pyatkov  
Дата: 06.05.04 07:56
Оценка:
Здравствуйте, g_i, Вы писали:

g_i>Если гарантируется, что end_time >= begin_time, тогда

Да гарантируется
g_i>SELECT id_order FROM rorder WHERE NOT (end_tyme < :DT_START OR begin_time > :DT_END)
СУПЕР! Вот блин как я сам не додумался!
Re[6]: Временной промежуток
От: Pavel_Lechenko Россия http://www.sdpm.ru
Дата: 06.05.04 08:34
Оценка: 3 (1)
Здравствуйте, Dmitry Pyatkov, Вы писали:

DP>Здравствуйте, KGP, Вы писали:


KGP>>SELECT id_order FROM rorder WHERE (<начальная дата> BETWEEN begin_time AND end_time)

KGP>> or (<конечная дата> BETWEEN begin_time AND end_time)

DP>Да так оно так, да не так.

DP>В смысле временой промежуток может наченаться раньше проверяемого и кончаться позже.

Похоже, что вот так:

SELECT id_order 
FROM rorder 
WHERE <начальная дата> = begin_time OR <конечная дата> = end_time  OR 
    (<начальная дата> BETWEEN begin_time AND end_time) OR 
    (<конечная дата> BETWEEN begin_time AND end_time) OR 
    (begin_time BETWEEN <начальная дата> AND <конечная дата>) OR 
    (end_time BETWEEN <начальная дата> AND <конечная дата>)


Собственно у меня была вот такая задачка: узнать, какие комнаты заняты на определенный промежуток времени. Решалась она вот как (MSSQL):

select roomID 
from roomBookings 
where @df=dateFrom or @dt=dateTo or (@df between dateFrom and dateTo) or 
    (@dt between dateFrom and dateTo) or (dateFrom between @df and @dt) or 
    (dateTo between @df and @dt)


Я правильно понял условие?
... << RSDN@Home 1.1.0 stable >>
С уважением,
Леченко Павел

SDPM.RU — Сообщество Менеджеров Проектов Разработки Программного Обеспечения
Re[7]: Временной промежуток
От: g_i  
Дата: 06.05.04 08:40
Оценка: 3 (1)
Здравствуйте, Pavel_Lechenko, Вы писали:


P_L>Похоже, что вот так:


P_L>
P_L>SELECT id_order 
P_L>FROM rorder 
P_L>WHERE <начальная дата> = begin_time OR <конечная дата> = end_time  OR 
P_L>    (<начальная дата> BETWEEN begin_time AND end_time) OR 
P_L>    (<конечная дата> BETWEEN begin_time AND end_time) OR 
P_L>    (begin_time BETWEEN <начальная дата> AND <конечная дата>) OR 
P_L>    (end_time BETWEEN <начальная дата> AND <конечная дата>)
P_L>


Тогда уж лучше так
SELECT id_order 
FROM rorder 
WHERE NOT (
 (<начальная дата> < begin_time AND <конечная дата> < begin_time)  OR 
 (<начальная дата> > time AND <конечная дата> > end_time)
)
Re: Временной промежуток
От: Dmitry Pyatkov  
Дата: 07.05.04 03:19
Оценка:
Всем большое спасибо! Особенно: g_i и Pavel_Lechenko.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.