2016-11-17 3 views
0

SQL заявление:SQL Finding предстоящая дата и время

SELECT * FROM table 
WHERE eventdate >= DATE(NOW()) 
AND eventtime > TIME(NOW()) 
ORDER BY eventdate ASC, eventtime ASC; 

Цель состоит в том, чтобы выбрать событие, которое приходит в следующий раз. Он работает очень хорошо, пока в тот же день нет двух событий. Например:

Event 1, 11/17/2016 7:00am 
Event 2, 11/17/2016 2:00pm 
Event 3, 11/18/2016 9:00am 

Я хочу выбрать событие 2, так как оно пройдет 7:00 утра 17-го числа. Заявление выше будет по-прежнему выбрать событие 1.

+3

Пожалуйста, не помещайте этот вопрос в базы данных, которые вы не используете. Я удалил те теги. Добавьте только тег для базы данных, которую вы * используете *. –

+0

Не уверен, что я понял, что вы ищете, но вы можете добавить LIMIT 2. – FDavidov

+0

Я не хочу выбирать событие 1, так как это уже произошло. Но вышеприведенное утверждение выбирает его. –

ответ

0

Как определено в комментариях, проблема связана с часовым поясом, который в настоящее время используется сервером, на котором находится база данных. Из-за этого, и что вы используете PHPmyAdmin, я считаю, что у вас нет полномочий изменять часовой пояс сервера.

Ваши возможные решения:

  • Используйте данные, которые уже в MST (UTC-07) или любой временной зоне сервер находится на
  • использовать текущие данные и вычитать 2 часа или convert the data to a time zone
  • Перепишите запрос, чтобы использовать NOW() + 2 часа
+0

Предложите удалить «Изменить (или найти, кто может изменить) часовой пояс сервера». Это просто переместит проблему к другому пользователю, который не находится в том же часовом поясе. Кстати, вот почему в большинстве случаев имеет смысл хранить дату и время UTC в базе данных, а не локальную дату/время. Все согласны с текущим временем UTC ... – user1429080

+0

Отмечено и обновлено. Я отвечал под впечатлением, что это был личный проект, когда я не должен был делать это предположение. – Fritz

1

Это должно работать:

SELECT * FROM table 
WHERE eventdate > DATE(NOW()) 
OR 
    (eventdate = DATE(NOW()) AND eventtime > TIME(NOW())) 

ORDER BY eventdate ASC, eventtime ASC; 

В принципе вы сравните, если дата в будущем (завтра) или дата сегодня и сколько времени прошло.

Если ваша дата в будущем, вам не важно время в этом случае.

Попробуйте.

+0

Похож, проблема в том, что NOW() на два часа отстает. Любая идея о том, как изменить время на EST? –

+0

Вот ответ: http://stackoverflow.com/questions/13916747/set-mysql-database-timezone-to-gmt – user2693928

0

Мне понадобится значение, сохраненное в eventdate и eventtimefields в вашем table в контексте вашего примера. потому что если вы проверяете time > TIME(NOW()), он не должен выбирать это событие, если прошло время.

+0

Вот снимок из таблицы: http://i.imgur.com/ulvwRin. png –

+0

Я вижу первый time установлен в 8:06, когда событие в 7:00 утра. Если код работает с 7:00 до 8:06, он также примет первое событие дня. Часовой пояс не является проблемой, поскольку SQL-оператор использует функцию NOW(), которая является функцией, выполняемой во время сервера. Все зависит от того, каково на самом деле точное время на сервере, и есть ли разница во времени между местом события и временем сервера. –

Смежные вопросы