SQL-запрос для отображения ближайшей даты?

#mysql #sql #datetime

#mysql #sql #дата-время

Вопрос:

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

Это моя таблица:

 EVENT_ID    EVENT_NAME     EVENT_START_DATE(DATETIME)
1           test           2011-06-01 23:00:00
2           test2          2011-06-03 23:00:00
3           test3          2011-07-01 23:00:00
4           test4          2011-08-09 23:00:00
5           test5          2011-06-02 23:00:00
6           test6          2011-04-20 23:00:00
  

Таким образом, результат запроса должен быть для идентификаторов 1,2,5, поскольку они являются наиболее близкими по сравнению с текущей датой..

РЕДАКТИРОВАТЬ: запрос должен находить только будущие события.

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

1. Эти даты относятся к 2010 году, так что на самом деле 4, 3 и 2 являются ближайшими к настоящему моменту 🙂 Я предположил, что вы имели в виду, что эти даты относятся к 2011 году.

2. @Mat вау, полностью пропустил это. Извините, исправлено на 2011

Ответ №1:

 SELECT event_id 
FROM Table 
ORDER BY ABS( DATEDIFF( EVENT_START_DATE, NOW() ) ) 
LIMIT 3
  

ABS() Означает, что событие, произошедшее 1 день назад, так же близко, как и событие, произошедшее 1 день назад в будущем. Если вам нужны только события, которые еще не произошли, выполните

 SELECT event_id 
FROM Table 
WHERE EVENT_START_DATE > NOW() 
ORDER BY EVENT_START_DATE 
LIMIT 3 
  

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

1. Этот запрос на самом деле просто сортирует выбранные значения, а не фильтрует их перед выбором.

Ответ №2:

   SELECT *
    FROM table
   WHERE EVENT_START_DATE >= NOW()
ORDER BY EVENT_START_DATE
   LIMIT 3
  

Ответ №3:

Запрос из принятого ответа фактически просто сортирует ранее выбранные значения, а не фильтрует их перед выбором. Но этот запрос работает для меня:

 SELECT event_id, event_date
FROM events 
WHERE ABS(TIMESTAMPDIFF(DAY, event_date, $some_date)) < 10
ORDER BY event_date
  

Объяснение: число 10 — это диапазон дней (как после, так и до). Без ABS() вы можете выбрать только предыдущие или будущие события, но мне нужно было ближайшее.

Ответ №4:

Я полагаю, это то, что вы искали бы. Это похоже на ответы всех остальных.

 SELECT EVENT_ID FROM TABLE WHERE EVENT_START_DATE > NOW() ORDER BY ABS(DATEDIFF(EVENT_START_DATE, NOW())) ASC LIMIT 3
  

Ответ №5:

 SELECT event_id FROM Table ORDER BY EVENT_START_DATE LIMIT 3
  

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

1. Это также вернет event_id 6, который произошел в прошлом.

2. было бы лучше, если бы это было так: ВЫБЕРИТЕ event_id Из таблицы EVENT_START_DATE >= CURRENT_TIMESTAMP ПОРЯДОК По EVENT_START_DATE ОГРАНИЧЕНИЕ 3