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

#php #mysql #date #getdate

#php #mysql #Дата #getdate

Вопрос:

Обновить

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

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

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

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

Комментарии:

1. Erm. PHP не имеет прямого доступа к вашей базе данных . Это означает, что вы не используете функцию PHP для получения чего-либо из MySQL. Не могли бы вы еще немного подумать и перефразировать это?

2. Когда вы говорите «ближайшая к сегодняшнему дню», вы имеете в виду действия до сегодняшнего дня, после сегодняшнего (предполагая, что у вас есть действия в будущем), или и то, и другое?

3. @Alin Purcaru: да, верно, виноват. Конечно, я имел в виду MySQL. Я не настолько опытен в PHP, поэтому мне просто интересно. Вы понимаете, чего я пытаюсь достичь? Или вам нужна дополнительная информация?

4. @d.syph. 3r Я имею в виду действия до сегодняшнего дня. База данных заполнена действиями, как прошлыми, так и будущими. Те, что были в прошлом, приведены только для нашей информации, те, что будут в будущем, — для посетителей. Поэтому я хочу отобразить только те, которые появятся в будущем.

5. @Alin Purcaru У меня недостаточно информации, чтобы точно знать, чего вы хотите. Я могу только догадываться. Вам следует отредактировать вопрос и добавить больше деталей.

Ответ №1:

Просто несколько советов:

Выберите ближайшие 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
  

Комментарии:

1. Это сделало свое дело! Большое спасибо. Это хорошо с точки зрения производительности, если у меня около 2000 действий?

2. В 2000 году это не имеет большого значения. Но на всякий случай добавьте индекс в time столбец.

3. Подойдет 🙂 Спасибо! (Почему это не имеет значения с 2000. Это происходит, когда их примерно 5?)

4. @Michiel Я имел в виду, что это не имеет большого значения, потому что 2000 — это не очень большое число.

5. Я думаю, вы можете использовать UNION ALL в этом случае, что и следует, поскольку это более эффективно.

Ответ №2:

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

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

Из обновленного вопроса следует учитывать только будущие действия … Итак…

 SELECT * FROM `activities` WHERE `date` > NOW() ORDER BY `date` LIMIT 2
  

Комментарии:

1. Быстрое решение. Но с точки зрения производительности слишком много событий. Вы не можете добавить индекс к такому выражению, но вы можете добавить его в столбец time.

Ответ №3:

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

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

Комментарии:

1. Изменение PHP $today на MySQL NOW() остановит внедрение SQL и по-прежнему всегда будет предоставлять соответствующую информацию, независимо от типа столбца ‘date’.

2. Только если «сегодня» является реальным сегодня 🙂