|
|
|
| estj gatovij skript dlja rezervaciji?
nado sdelatj chtob polzovatelj mog zapisatsa na prijom: vibirajet nachalo denj, vremja prijoma i interval vremeni 10, 20, 30 min ili bolshe. kakije ideji?
naprimer vibirajet datu 20 maj vremja nachala 13:00 i vremja vizita 15 min.
polistal vashi knigi tam nechego padobnogo nenashol.
kakije ideji naschot strukturi bazi dannix
vot moj variant
people
id_person|person
time
id|start_time|end_time|id_person
tolko problemi s operacijami s vremenjem. nado chtob esli petja zapisalsa na prijom v 13:00 na 45 minut chtob nekto v 13:00-13:45 nemog zapisatsa. kak eto relizovatj. Kak opredelitj v ocherednoj interval vremeni ktota uzhe zapisalsa na prijom ili net? interesujet kak hranitj vremja v baze dannix | |
|
|
|
|
|
|
|
для: rolands
(07.05.2007 в 23:36)
| | Подумайте о других, translit.ru | |
|
|
|
|
|
|
|
для: Бамси
(07.05.2007 в 23:49)
| | надо сделать чтоб ползователь мог записатса на приём: вибираeт начало - ден, время приёма и интервал времени 10, 20, 30 мин или больше. какие идеи?
например вибирает дату 20 май время начала 13:00 и время визита 15 мин.
полистал ваши книги там нечего падобного ненашол.
какие идеи насчот структури бази данних
вот мой вариант
people - люди которие принимают поситителей
id_person|person|visits_time_begin|visits_time_end
time - занятое время
time_id|start_time|end_time|id_person
visits - информация о посесчениях
visit_id|time_id|id_person|visitor_name|visitor_surname|visitor_phone|visitor_mail|visitor_something...
только проблеми с операциями с временем. надо чтоб если петя записалса на приём в 13:00 на 45 минут чтоб некто в 13:00-13:45 немог записатса. как ето релизовать? Как определить в очередной интервал времени ктота уже записалса на приём или нет? интересуэт как хранить время в базе данних
GURU help needed :) | |
|
|
|
|
|
|
|
для: Rolands
(07.05.2007 в 23:57)
| | Форма:
ФИО
Время приема. (день, месяц, время)
Длительность приема.
Передается все скрипту.
Из время приема все пихаем в mktime().
Прибавляем время которые указано в длительности приема.
Так формируется time_end.
Заносим все в бд.
id|FIO|time_start|time_end|lenght|
Далее регистрируется еще один пользователь, скрипт проверяет, что бы time_start нового пользователя было больше либо равно времени последнего посетителя. | |
|
|
|
|
|
|
|
для: Бамси
(08.05.2007 в 00:09)
| | идея примерно ясна толко чтоб записатса на приём регицтрация ненужна кто хочет может записатса
пробема возникла чтоб в время когда ктота уже записалса некто дрогой немог записатса
б таблице people хранятса люди коториe принимают поситителей и бремя от ... до у в етоt интервал может записатса поситители.
чтота на подобиэ приём у брача (брачеи много, пациентов тоже) к одномы брачу в вибрахий период времени может записатса один человек, если в ето бремя ктота уже записалса ето надо определит и вибести цообсчение и время когда врач свободен
sorry about my russian :) | |
|
|
|
|
|
|
|
для: Rolands
(07.05.2007 в 23:57)
| | я бы сделал так:
start_time|end_time - это поля в базе
new_start_time|new_end_time - это данные которые пытаемся сохранить
делаем проверку
SELECT COUNT(*) FROM `time` WHERE
(new_start_time BETWEEN start_time AND end_time) OR
(new_end_time BETWEEN start_time AND end_time) OR
(start_time BETWEEN new_start_time AND new_end_time) OR
(end_time BETWEEN new_start_time AND new_end_time)
|
в первом часу ничего лучше в голову не приходит:) | |
|
|
|
|
|
|
|
для: Loki
(08.05.2007 в 00:19)
| | какиe есчо идеи
интересуэт решение проблеми от aвторов книг :) po PHP MYSQL | |
|
|
|
|
|
|
|
для: Loki
(08.05.2007 в 00:19)
| | Саш, between тут не подойдет - тут придется делать совершенно симметричное (ортогональное) сравнение диапазонов. Иначе новый диапазон добавлять изрядно тяжело. | |
|
|
|
|
|
|
|
для: Trianon
(08.05.2007 в 00:34)
| | Почему не подойдет... вроде вполне рабочий вариант получился... или возможен случай, когда он облажается? | |
|
|
|
|
|
|
|
для: Loki
(08.05.2007 в 00:37)
| | там чтота на подобиe приём у брача (брачеи много, пациентов тоже) к одному брачу в вибраний период времени может записатса один человек. У каждого врача есть рабозчие время когда он принимаэт пациентов и в етот период может записатса пациенты.
незнаю с BETWEEN получитса или нет | |
|
|
|
|
|
|
|
для: Loki
(08.05.2007 в 00:37)
| |
<?$sql= "
SELECT servers.* FROM servers
LEFT JOIN (SELECT server_id from reservations
WHERE ($res_start>= res_start AND $res_start < res_stop)
OR ( res_stop >= $res_stop AND res_start < $res_stop)
) AS except ON servers.server_id = except.server_id
WHERE except.car_id IS NULL";
|
Вот этот оператор обеспечивает выборку свободных ресурсов, резервируемых интервалами времени. Если ты сможешь написать его компактнее через BETWEEN без нарушения логики - буду благодарен. | |
|
|
|
|
|
|
|
для: Trianon
(08.05.2007 в 10:31)
| | Если я ничего не напутал, то твой вариант не отслеживает ситуацию, когда существующий диапазон полностью перекрывается новым. | |
|
|
|
|
|
|
|
для: Loki
(08.05.2007 в 11:41)
| | Вариант, когда существующий диапазон полностью перекрывается новым, это
res_start < $res_start < $res_stop < res_stop
|
Получаем:
SELECT server_id from reservations
WHERE (1 AND 1)
OR ( 1 AND 1)
|
Возвращает занятый server_id и NULL во внешнем селекте
SELECT servers.* FROM servers
LEFT JOIN (SELECT server_id ...) AS except ON servers.server_id = except.server_id
WHERE except.car_id IS NULL";
|
мы не получим
SELECT servers.* FROM servers .... WHERE 0;
|
ergo: Занятый ресурс нам не отдадут. | |
|
|
|
|
|
|
|
для: Trianon
(08.05.2007 в 13:47)
| |
res_start < $res_start < $res_stop < res_stop
|
это когда новый перекрывается старым, а старый новым это
$res_start < res_start < res_stop < $res_stop
|
| |
|
|
|
|
|
|
|
для: Loki
(08.05.2007 в 14:24)
| | И что - результат другой?
По-моему - тот же самый. :) | |
|
|
|
|
|
|
|
для: Trianon
(08.05.2007 в 14:28)
| |
WHERE (0 AND 1)
OR ( 0 AND 1)
|
или я чего-то не понимаю? | |
|
|
|
|
|
|
|
для: Loki
(08.05.2007 в 15:59)
| | Посыпаю пеплом вешалку для кепки.
Исправлено.
<?$sql= "
SELECT servers.* FROM servers
LEFT JOIN (SELECT server_id from reservations
WHERE ($res_start>= res_start AND $res_start < res_stop)
OR ( res_start >= $res_start AND res_start < $res_stop)
) AS except ON servers.server_id = except.server_id
WHERE except.car_id IS NULL";
|
| |
|
|
|
|
|
|
|
для: Trianon
(08.05.2007 в 16:24)
| | Теперь у меня подкопаться не получается.... придется смириться:) | |
|
|
|
|
|
|
|
для: Loki
(08.05.2007 в 00:19)
| | Итак, контрпример, показывающий, что конструкцией BETWEEN пользоваться не получится.
имеющиеся записи
(1, '2007-05-08 15:00:00', '2007-05-08 16:00:00'),
(1, '2007-05-08 17:00:00', '2007-05-08 18:00:00')
|
Резервируемый интервал (сюрприз!)
('2007-05-08 16:00:00', '2007-05-08 17:00:00'),
|
| |
|
|
|
|
|
|
|
для: Trianon
(08.05.2007 в 16:56)
| | Да... тут бы строгое сравнение было очень кстати:) | |
|
|
|