Выбор записей по дате -> = NOW (), MySQL - PullRequest
27 голосов
/ 25 июня 2010

У меня есть таблица календаря событий, и я хотел бы выбрать события с датами, равными или большими, чем сегодня. Когда я использую следующий оператор SELECT, он только извлекает события в будущем (> NOW ()):

<?php    
$db->query("SELECT * FROM events WHERE event_date >= NOW()");
?>

Как бы я выбрал все события, которые происходят сегодня или в будущем?

Спасибо

Ответы [ 6 ]

41 голосов
/ 25 июня 2010

Вы ищете CURDATE():

$db->query("SELECT * FROM events WHERE event_date >= CURDATE()");

Или:

$db->query("SELECT * FROM events WHERE event_date >= CURRENT_DATE()");
15 голосов
/ 25 июня 2010

Причина, по которой этот запрос:

SELECT * FROM events WHERE event_date >= NOW()

... возвращает записи из будущего, потому что NOW () включает время и дату. И эта часть времени указывает время, когда оператор [функция или запуск] начал выполняться. Таким образом, это означает, что начало дня в типе данных DATETIME выглядит следующим образом: 2010-06-24 00:00:00 (ГГГГ-ММ-ДД ЧЧ: ММ: СС, с точностью до микросекунды), которое при NOW () будет отображать что-то вроде 2010-06-24 14:24:31 ...

Вот ваши варианты:

SELECT * FROM events WHERE event_date >= DATE(NOW())
SELECT * FROM events WHERE event_date >= DATE(CURRENT_TIMESTAMP)
SELECT * FROM events WHERE event_date >= CURRENT_DATE()
SELECT * FROM events WHERE event_date >= CURRDATE()
2 голосов
/ 20 февраля 2012

Вы также можете сделать

<?php    
$db->query("SELECT * FROM events WHERE UNIX_TIMESTAMP(event_date) >=     UNIX_TIMESTAMP(NOW())");
?>

Что более точно, чем использование CURTIME (), если по какой-либо причине вы используете время и дату

1 голос
/ 25 июня 2010

Если вас интересует только дата, а не время, используйте CURDATE () вместо NOW().

Конечно, вы можете использовать синоним CURRENT_DATE (сили без скобок после него), но в документах, на которые я указывал, CURDATE указано как первое написание; -).

0 голосов
/ 17 марта 2017

Вот разница между CURDATE и NOW:

mysql> select CURDATE();
+------------+
| CURDATE()  |
+------------+
| 2017-03-17 |
+------------+
1 row in set (0.03 sec)

mysql> select NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2017-03-17 09:04:45 |
+---------------------+
1 row in set (0.00 sec)

Я всегда использую СЕЙЧАС, чтобы быть точным

0 голосов
/ 25 июня 2010

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

Используйте это:

select * from events where datediff(event_date, now()) >= 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...