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

ОБНОВЛЕНИЕ

Я делаю бэкэнд сайта. Основная цель веб-сайта — дать посетителям четкое представление о том, когда и какие мероприятия мы организуем.
Поэтому я заполнил базу данных всеми видами мероприятий. Каждое действие имеет дату, название и некоторую другую информацию.

Совершенно очевидно, что посетителям не помогает показ действий в прошлом, поэтому я хочу, чтобы они показывали только предстоящие действия. И чтобы сэкономить себе много работы, было бы неплохо сделать PHP/MySQL всю работу и показывать посетителям только 2 следующих события.

Можете ли вы посоветовать мне функцию MySQL для этого?

Заранее спасибо,


person Michiel    schedule 18.04.2011    source источник
comment
Эм. PHP не имеет прямого доступа к вашей базе данных. Это означает, что вы не используете функцию PHP для получения чего-либо из MySQL. Не могли бы вы еще немного подумать и перефразировать?   -  person Alin Purcaru    schedule 18.04.2011
comment
Когда вы говорите «ближе к сегодняшнему дню», вы имеете в виду деятельность до сегодняшнего дня, после сегодняшнего дня (при условии, что у вас есть деятельность в будущем) или и то, и другое?   -  person d.syph.3r    schedule 18.04.2011
comment
@Алин Пуркару: да, верно, мой плохой. Конечно, я имел в виду MySQL. Я не так хорошо разбираюсь в PHP, поэтому мне просто интересно. Вы понимаете, чего я пытаюсь добиться? Или вам нужна дополнительная информация?   -  person Michiel    schedule 18.04.2011
comment
@ d.syph.3r Я имею в виду действия до сегодняшнего дня. База данных заполнена действиями, как прошлыми, так и будущими. Те, что были в прошлом, предназначены только для нашей информации, те, что в будущем, предназначены для посетителей. Поэтому я хочу отображать только те, которые будут в будущем.   -  person Michiel    schedule 18.04.2011
comment
@ Алин Пуркару У меня недостаточно информации, чтобы точно знать, чего ты хочешь. Я могу только догадываться. Вы должны отредактировать вопрос и добавить больше деталей.   -  person Alin Purcaru    schedule 18.04.2011
comment
@Michiel, обновите свой вопрос ... вам не нужна ближайшая дата, вам нужна ближайшая дата в будущем ...   -  person Jacob    schedule 18.04.2011
comment
@Alin @Jacob, Вопрос обновлен. Я надеюсь, что теперь это более ясно. Если нет, пожалуйста, дайте мне знать   -  person Michiel    schedule 18.04.2011
comment
@Michiel У вас нет определенной функции. Вы должны сделать свой собственный запрос. Ибо то, что вы хотите, довольно просто. Смотрите мой обновленный ответ ниже.   -  person Alin Purcaru    schedule 18.04.2011


Ответы (3)


Просто совет:

Выберите ближайшие 2 события до текущего момента и ближайшие 2 события после текущего момента.

(SELECT *
FROM ...
WHERE `time` < NOW()
ORDER BY `time` DESC
LIMIT 2)
UNION
(SELECT *
FROM ...
WHERE `time` > NOW()
ORDER BY `time` ASC
LIMIT 2)

На данный момент у вас будет не более 4 событий в PHP. Но вам нужно только 2. Ближайшие 2. Чтобы узнать, какие из них ближе всего, используйте strtotime и проверьте разницу между временными метками событий и текущей временной меткой, которую можно получить, вызвав time(). После этого вы сохраняете только 2 ближайших события.

Обратите внимание, что это можно сделать напрямую из MySQL, но так сложнее.


@Последнее обновление. Достаточно прочитать это, если вы не хотите знать больше.

Просто используйте этот запрос:

SELECT *
FROM ...
WHERE `time` > NOW()
ORDER BY `time` ASC
LIMIT 2
person Alin Purcaru    schedule 18.04.2011
comment
Этот сделал свое дело! Большое спасибо. Это хорошо с точки зрения производительности, если у меня около 2000 действий? - person Michiel; 18.04.2011
comment
В 2000 году это не так важно. Но на всякий случай добавьте индекс в столбец time. - person Alin Purcaru; 18.04.2011
comment
Будет сделано :) Спасибо! (Почему это не имеет значения с 2000. Имеет ли значение, когда их около 5?) - person Michiel; 18.04.2011
comment
@Michiel Я имел в виду, что это не имеет большого значения, потому что 2000 - не очень большое число. - person Alin Purcaru; 18.04.2011
comment
Я думаю, вы можете использовать UNION ALL в этом случае, что и следует делать, поскольку это более эффективно. - person eric.itzhak; 22.11.2012

Вы можете использовать DATEDIFF и ABS...

SELECT * FROM `activities` ORDER BY ABS(DATEDIFF(NOW(), `date`)) LIMIT 2

Из обновленного вопроса следует рассматривать только будущую деятельность... Итак...

SELECT * FROM `activities` WHERE `date` > NOW() ORDER BY `date` LIMIT 2
person Jacob    schedule 18.04.2011
comment
Быстрое решение. Но плохо с точки зрения производительности, если событий слишком много. Вы не можете добавить индекс к такому выражению, но вы можете добавить его к столбцу времени. - person Alin Purcaru; 18.04.2011

$query = 'SELECT .... FROM ... WHERE `date` > '.$today.' ORDER BY `date` DESC LIMIT 2';

$today зависит от типа столбца date.

person Emmerman    schedule 18.04.2011
comment
Изменение $today в PHP на NOW() в MySQL остановит внедрение SQL и всегда будет предоставлять актуальную информацию независимо от типа столбца «дата». - person Zimzat; 18.04.2011
comment
Только если «сегодня» реально сегодня :) - person Emmerman; 18.04.2011