SQL запрос интервалов дат - PullRequest
2 голосов
/ 26 мая 2011

Я управляю базой данных событий.Каждое событие имеет начальную и конечную отметки времени (INT, unix timestamp).

В настоящее время я могу выполнить следующие действия с одним запросом SQL:

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

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

Например:

Событие начинается 2011/05/25 и заканчивается 2011/05/27, я не могуперечислите его на странице 2011/05 / 26.

Мой фактический запрос SQL -

SELECT * FROM `event` 
WHERE (`start` BETWEEN ? AND ?) OR (`end` BETWEEN ? AND ?) 
ORDER BY start ASC

Два связанных параметра (временные метки Unix) автоматически рассчитываются в зависимости от типа заданного параметра (целый месяц или определенный день)

Возможно ли получить эти события (охватывающие несколько дней) в день между двумя конечными точками, расширяя мой запрос выше?

Пожалуйста, дайте мне знатьесли я могу уточнить мой вопрос.

Обновление

Пример:

event start: 1309125660 (2011-06-27 00:01:00)
end end: 1314050340 (2011-08-22 23:59:59)

select start: 1312408860 (2011-08-04 00:01:00)
select end: 1312495199 (2011-08-04 23:59:59)

Это событие не появится, когда я попытаюсь перечислить события, происходящие 2011/08/4

Ответы [ 3 ]

3 голосов
/ 26 мая 2011

Если я правильно понял вопрос, с [:start, :end], представляющим интерес для вас, вы ищете:

select *
 from event
where -- event started earlier, ends later
      start <= :start and :start <= end
   or -- event starts during [:start, :end]
      :start <= start and start <= :end
   or -- event ends during [:start, :end]  
      :start <= end and end <= :end;

Если вы ищете конкретный :day, используйте :day как :start и :day + 1 day как :end.

1 голос
/ 26 мая 2011

Если вы хотите запросить все события «сегодня» (или какой-либо другой даты), события, начинающиеся в прошлом или «сегодня» и заканчивающиеся «сегодня», или в будущем вам потребуется запрос типа:

SELECT * FROM `event` WHERE 
   (`start` >= :start) AND (`end` <= :end) OR
   (`start` <= :end) AND (`end` >= :start)
ORDER BY start ASC

с ? является вашей фактической датой.

Test data:

123456789
   nn     <-- :start, :end
 xx       1 
      xx  2 
  xx      3 s
    xx    4 s
  xxxx    5 s
   xx     6 s

Test query:

select * from event where 
(start >= 4 and end <= 5) or
(start <= 5 and end >= 4)
0 голосов
/ 26 мая 2011

Я думаю, вы должны изменить запрос следующим образом:

SELECT * FROM `event` WHERE ? BETWEEN `start` AND `end` ORDER BY start ASC

где param?текущая дата или текущая отметка времени.

...