Выберите все временные метки, которые находятся между диапазонами в MySQL

Я работаю над функцией календаря для моего проекта.

У меня есть таблица, подобная следующей:

ID | Title             |Where     |tri| Start      | End        | tro
______________________________________________________________________
"4"|"Planingfrenzy"    |"Street 8"|"0"|"1395835200"|"1395846000"|"1"
"5"|"Other meeting"    |"Road 8"  |"0"|"1395140400"|"1395158400"|"1"
"6"|"Third meeting"    |"Lane 8"  |"0"|"1395819000"|"1395824400"|"1"
"8"|"Weekend at cyprus"|"Cyprus"  |"0"|"1395928800"|"1396162800"|"1"

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

/*
   Start is a unixtimestamp for the beginning of the day
   End is a unixtimestamp for the end of the day
*/

//This Returns to many events since all events that ends before the end timestamp is a match etc. 
SELECT * FROM events WHERE (start > ? OR end<?) 

//This matches all events that start and end at the same day. But a multi day event like "Weekend at cyprus" isn't returned since it is out of range
SELECT * FROM events WHERE (start > ? AND end<?)

Есть ли какой-нибудь способ сопоставления в MySQL или PHP, если диапазон начала / конца "касается" диапазона запрошенного временного штампа?

3 ответа

Решение

Предполагая, что два значения ? самые ранние и последние значения в день, я думаю, вы хотите:

where start < (?end) and end > (?start)

То есть, есть совпадение, когда начало одного предшествует концу другого, и наоборот.

В этом ответе (?end) предназначена для того, чтобы быть последней отметкой времени дня и (?start) предназначен быть первым.

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

На самом деле я не проверял ваш набор данных, но это должно привести вас в правильном направлении, независимо от:

SELECT * FROM events 
WHERE (Start >= :start AND Start < :end)
OR    (End >= :start AND End < :end)

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

$timezone = new DateTimeZone('UTC');
$date = new DateTime('today', $timezone);

$start = $date->getTimestamp();
$end   = $date->add(new DateInterval('P1D'))->getTimestamp();

Надеюсь, это поможет.

В этом случае правильное выражение должно использовать МЕЖДУ:

SELECT * FROM events WHERE 1 AND date BETWEEN start AND end

Документация MySQL

Другие вопросы по тегам