2013-10-09 3 views
0

Я хочу, чтобы иметь возможность рассчитать, если что-то находится в пределах диапазона и вернуть все результаты.Запрос в течение нескольких дней и часов

У нас есть таблица, которая запланировала еженедельные мероприятия. Каждая строка таблицы имеет уникальный идентификатор, номер дня и номер часа.

id (auto int) | dayNumber (int from 0 to 6) | hourNumber (int from 0 to 23) 

Основываясь на этой таблице, мы можем определить, когда событие должно произойти в расписании. Например, запись дняNumber = 2 и hourNumber = 3 означает, что событие запланировано на вторник в 3 часа ночи.

Часть, которую мне трудно найти, заключается в том, что мне нужно запустить запрос, чтобы получить ряд запланированных событий. Поэтому я перейду в минимум dayNumber и hourNumber и максимум dayNumber и hourNumber. Мои ожидаемые результаты будут соответствовать каждой соответствующей записи в этом диапазоне.

Более легкий случай, когда минимум меньше максимального. Например (в PHP),

$minimumDayNumber = 1; $minimumHourNumber = 3; 
$maximumDayNumber = 5; $maximumHourNumber = 6; 

Где она становится все более сложным, когда я хочу, чтобы найти диапазон с субботы по вторник. Для этого переменные выглядели бы примерно так: $ minimumDayNumber = 6; $ minimumHourNumber = 3; $ maximumDayNumber = 2; $ maximumHourNumber = 6;

Используя эти входы, мне нужно будет запросить базу данных и найти все записи в этом диапазоне. Должен быть хороший алгоритм, чтобы либо построить запрос, либо хороший запрос, чтобы сделать это достаточно прямо.

Это кажется легким на бумаге, и я сделал это с диапазонами дат (поля фактической даты), но я просто не могу заставить это работать правильно. Заранее благодарю вас за помощь и сообщите мне, если вам потребуется дополнительное разъяснение.

+0

Вы только сохраняете данные за одну неделю и очищаете старые данные? – Diver

+0

Здесь мы не регистрируем данные. Мы сохраняем только еженедельное расписание. Таким образом, вся эта таблица содержит список запланированных периодов недели для события. Более длинный ответ: в этой таблице есть дополнительное поле, которое я удалил, чтобы упростить вопрос. Это идентификатор устройства.Таким образом, эта таблица служит для поддержания расписания для сотен устройств. Событие одинаково для всех устройств, поэтому нет поля, объясняющего, какое событие должно иметь место. – Terry

+0

Разделение ваших дат на отдельные значения приводит к болезненным запросам, например. вы не можете просто «время от времени» и должны выполнять «dayfield> $ day и hourfield <$ hour», что затем исключает много действительных дат/времени из-за чрезмерного сравнения. –

ответ

1

Попробуйте

where (($maximumDayNumber > $minimumDayNumber and (dayNumber+hourNumber/24) >= ($minimumDayNumber+$minimumHourNumber/24) and (dayNumber+hourNumber/24) <= ($maximumDayNumber+$maximumHourNumber/24)) 
    or ($maximumDayNumber < $minimumDayNumber and ((dayNumber+hourNumber/24) <= ($minimumDayNumber+$minimumHourNumber/24) OR (dayNumber+hourNumber/24) >= ($maximumDayNumber+$maximumHourNumber/24)))) 
+0

Еще одно редактирование для подсчета часов. Учитывая структуру данных, день и час действительно должны учитываться как единое целое, поэтому я добавил часы как часть дня и использовал это в сравнении. – Diver

+0

также я не парень php, и я не уверен в базе данных, но вы можете упростить это, если ваш позволяет между и не между двумя, а не всего <= > =. – Diver

+0

Мне нравится простота ответа, потому что он получает все в sql-заявление. У вас небольшая логическая ошибка на последней строке. Поскольку нам нужны числа, большие, чем min, и числа, меньшие max, чтобы оба отображались, нам нужно заключить в скобки часть инструкции и превратить ее в «или». Кроме того, существует небольшой тип $. Я отправлю комментарий рядом с исправлением. – Terry

1

Будет ли это работать?

SELECT * FROM activities 
WHERE IF($minDayNum = $maxDayNum, 
    (dayNumber = $minDayNum AND hourNumber >= $minHourNum AND hourNumber <= $maxHourNum), 
    (
     IF($minDayNum > $maxDayNum, 
      (dayNumber > $minDayNum AND dayNumber < $maxDayNum), 
      (dayNumber > $minDayNum OR dayNumber < $maxDayNum) 
     ) 
     OR (dayNumber = $minDayNum AND hourNumber >= $minHourNum) 
     OR (dayNumber = $maxDayNum AND hourNumber <= $maxHourNum) 
    ) 
) 

Pardon резиновая утка:

  • Первый IF проходит проверку, чтобы увидеть, если на следующий день тот же
  • Если да, то простой, где положение сузит часы дня
  • Если нет, то перейти к другому, если заявлению, чтобы увидеть, если мы обход недель
  • условных тянем во всех событиях между диапазоном (не равно), сознающая неделю окончаний
  • Последних два условия тянуть в конкретном начальном/оконечный день/время события

Я ничего не макет, дайте мне знать, как она работает.

+0

Спасибо, Джейсон. Я думаю, ваше решение будет работать. Я поддерживаю ваше решение, но принимаю другое, потому что мне понравилась его простота. Однако, спасибо за вклад. Логика кажется звуковой. – Terry

Смежные вопросы