Выберите все временные метки, которые находятся между диапазонами в 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