У меня есть таблица в моей БД примерно так:
----------------------------------------------------------
| event_id | date | start_time | end_time | duration |
----------------------------------------------------------
| 1 | 2011-05-13 | 01:00:00 | 04:00:00 | 10800 |
| 2 | 2011-05-12 | 17:00:00 | 01:00:00 | 28800 |
| 3 | 2011-05-11 | 11:00:00 | 14:00:00 | 10800 |
----------------------------------------------------------
Эти примерные данные не дают полностью точной картины, обычно есть события, охватывающие каждый час каждого дня.
Дата всегда относится к времени начала, так как время окончания может иногда быть следующим днем.
Продолжительность в секундах.
<code>SELECT *
FROM event_schedules
WHERE (
date = CURDATE() //today
OR
date = DATE_SUB(CURDATE(), INTERVAL 1 DAY) //yesterday
)
// and ended before now()
AND DATE_ADD(CONCAT(date, ' ', start_time), INTERVAL duration SECOND) < NOW()
ORDER BY CONCAT(date, ' ', start_time) DESC
LIMIT 1
У меня там есть предложение, предложение OR в квадратных скобках, которое не нужно. Я надеялся, что это может улучшить время запроса, сначала отфильтровывая любые «события», которые не начинаются сегодня или вчера. Единственный способ найти самое последнее «событие» - это упорядочить записи и взять первое. Добавляя это дополнительное ненужное предложение, я действительно сокращаю список записей, которые нужно упорядочить? Если это произойдет, я не могу представить, чтобы оптимизатор смог выполнить эту оптимизацию, большинство других вопросов, подобных этому, говорят об оптимизаторе.