проблема с выборкой промежутков времени

sundance2001

Новичок
Хитрая задача

Уважаемые коллеги, вновь прошу вашей помощи. Умоляю, помогите, а то уже несколько часов парюсь с этой задачей. Теперь о ней.

В MySQL БД есть два столбца - один со временем начала, а другой со временем конца работы заведений. В форме запроса посредством двух ("с" и "до") ComboBox'ов гость выбирает время, в которое хотел бы посетить заведение. Результатом должен быть список заведений, открытых соответственно критерию поиска, причём допускается, что один из критериев поиска может отсутствовать (например: с 18 часов до "не важно"). Проблема начинается для тех заведений, которые заканчивают работать на следующий день, т.е. после полуночи.

Я написал вот что:
PHP:
//Для заведений, не работающих по ночам
	if ($_POST['open_to'] != 'none') {
		if ($_POST['open_from'] == 'none') {
			$terms .= " AND (places.open_from < ".$_POST['open_to'].") AND (places.open_to >= ".$_POST['open_to'].")";
		} else {
			$terms .= " AND (places.open_to >= ".$_POST['open_to'].")";
		}
	}
	if ($_POST['open_from'] != 'none') {
		if ($_POST['open_to'] == 'none') {
			$terms .= " AND (places.open_from <= ".$_POST['open_from'].") AND (places.open_to > ".$_POST['open_from'].")";
		} else {
			$terms .= " AND (places.open_from <= ".$_POST['open_from'].")";
		}
	}
Но этот код не обрабатывает все случаи, а именно, когда "время закрытия" < "Времени открытия".

Многим наверняка приходилось сталкиваться с подобной проблемой. Поделитесь, как вы ее решили?
 

Линка

Новичок
sundance2001
Выбираешь из базы все заведения время открытия которых меньше open_to и время закрытия больше open_from.
только в базу заноси время закрытия не 2 часа ночи(например)
а 24+2 [для случая заполночь]
 

sundance2001

Новичок
Хорошо.
Теперь предположим, что клуб открыт до 6 утра, а у нас записано до 24+6. Посетитель хочет отдохнуть с 2 до 5. Получается нужно проверять два промежутка: 2-5 и 26-30. А как запрос такой построить?
 

Линка

Новичок
sundance2001с 2 до 5.
в случае заполночь open_to=open_to+24
и проверяешь 26>открытия заведения
open_from=open_from.+24:
закрытие 29<30
к любому времени, будь то время запроса или время закрытия если оно после полуночи прибавляй 24.тогда все бу коректно.
 

Crazy

Developer
Самое простое и тупое решение (кстати, получаемое строго согласно теории): создает таблицу WorkingHours с полями ObjectID и HourNo. Для каждого объекта в ней будет от 0 :) до 24 записей.

Запросы к этой структуре строятся до смешного легко. :)
 
Сверху