Ответ 1
Вы ищете CURDATE()
:
$db->query("SELECT * FROM events WHERE event_date >= CURDATE()");
Или:
$db->query("SELECT * FROM events WHERE event_date >= CURRENT_DATE()");
У меня есть таблица Calendar of Events, и я хотел бы выбрать события с датами, равными или большими, чем сегодня. Когда я использую следующий оператор SELECT, он только извлекает события в будущем ( > NOW()):
<?php
$db->query("SELECT * FROM events WHERE event_date >= NOW()");
?>
Как я могу выбрать все события, которые либо сегодня, либо в будущем?
Спасибо
Вы ищете CURDATE()
:
$db->query("SELECT * FROM events WHERE event_date >= CURDATE()");
Или:
$db->query("SELECT * FROM events WHERE event_date >= CURRENT_DATE()");
Причина, по которой этот запрос:
SELECT * FROM events WHERE event_date >= NOW()
... возвращает записи из будущего, потому что NOW() включает время, а также дату. И эта временная часть указывает время, в которое начинает выполняться оператор [function or triggering]. Таким образом, начало дня в типе данных DATETIME выглядит так: 2010-06-24 00:00:00
(YYYY-MM-DD HH: MM: SS, до микросекундной точности), который 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()
Вы также можете сделать
<?php
$db->query("SELECT * FROM events WHERE UNIX_TIMESTAMP(event_date) >= UNIX_TIMESTAMP(NOW())");
?>
Что более точно, чем использование CURTIME(), если вы случайно используете время, а также дату
Если вам нужна только дата, а не время, используйте CURDATE() вместо NOW()
.
Конечно, вы можете использовать синоним CURRENT_DATE
(с или без круглых скобок после него), но документы, на которые я указал, чтобы дать CURDATE
в качестве первого написания; -).
Ваша проблема в том, что now() очень точен. Итак, даты на сегодняшний день и раньше, потому что они начались в начале дня.
Используйте это:
select * from events where datediff(event_date, now()) >= 0;
Здесь разница между 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)
Я всегда использую СЕЙЧАС только для того, чтобы быть точным.