Ok Редактирование этого …
SELECT * FROM votelog WHERE ipaddress = '127.0.0.1' AND datevoted BETWEEN DATE_SUB( CURDATE( ) , INTERVAL 24 HOUR ) AND CURDATE( ) LIMIT 0 , 30
Это пример запроса, который я пытаюсь запустить, чтобы найти сообщения за последние 24 часа. За последние 60 минут я также запускаю отдельный для разных потребностей. Проблема в том, что в таблице, которую я тестирую, есть по крайней мере 4 строки, три из которых попадают под 24-часовое предложение.
Хорошо, поэтому я разобрался в своей проблеме, 1 Im, чтобы проклясть усталость. 2 Ужасное использование Between и Date_Sub. Это не рассвело на меня, пока я не должен был использовать имя col, где у меня CURDATE () будет отвечать мой собственный вопрос ниже.
это то, как выглядит временная метка в БД, стандартная DATETIME .. 2011-09-01 13:20:08
при этом я не даю никаких результатов.
Вы не используете BETWEEN правильно, правильный синтаксис:
expr МЕЖДУ min И max
вы должны изменить конец своего запроса на:
...BETWEEN DATE_SUB(CURDATE(), INTERVAL 24 hour) AND CURDATE()
или use >
.
Вы пробовали это? BETWEEN
AND
ИНИКАЕТ …
$query = "SELECT * FROM votelog WHERE ID=".mysql_real_escape_string($_GET['id'])." AND ipaddress='".mysql_real_escape_string(getRealIpAddr())."' AND datevoted BETWEEN DATE_SUB(CURDATE(), INTERVAL 24 HOUR) AND DATE_SUB(CURDATE(), INTERVAL 60 MINUTE)";
И я думаю, вы всегда можете это сделать так
$query = "SELECT * FROM votelog WHERE ID=".mysql_real_escape_string($_GET['id'])." AND ipaddress='".mysql_real_escape_string(getRealIpAddr())."' AND datevoted >= DATE_SUB(CURDATE(), INTERVAL 24 HOUR) AND datevoted <= DATE_SUB(CURDATE(), INTERVAL 60 MINUTE)";
$query = "SELECT * FROM votelog WHERE ID=".(int)$_GET['id']." AND ipaddress='".mysql_real_escape_string(getRealIpAddr())."' AND datevoted > DATE_SUB(CURDATE(), INTERVAL 24 hour)";
Отредактировано: Поскольку ID не является строковым типом, вместо mysql_real_escape_string($_GET['id'])
, просто используйте (int)$_GET['id']
.
SELECT * FROM votelog WHERE ipaddress = '127.0.0.1' AND DATE_SUB( datevoted , INTERVAL 24 HOUR ) LIMIT 0 , 30
Так что после долгих взглядов это мой результат … я чувствую себя грязным сейчас.
Вероятно, у вас нет даты, кроме поля даты и времени (или временной метки, которая немного отличается). Не используйте CURDATE()
. В вашем запросе CURDATE()
дает 2011-09-03
(дата!), И когда он сравнивается с вашим полем datetime, он рассматривается как 2011-09-03 00:00:00
(полночь!), Поэтому ваш запрос ( если выполняется сегодня), то же самое:
SELECT * FROM votelog WHERE ipaddress = '127.0.0.1' AND datevoted BETWEEN DATE_SUB( `2011-09-03 00:00:00` , INTERVAL 24 HOUR ) AND `2011-09-03 00:00:00` LIMIT 0 , 30
поэтому, так же, как:
SELECT * FROM votelog WHERE ipaddress = '127.0.0.1' AND datevoted BETWEEN `2011-09-02 00:00:00` AND `2011-09-03 00:00:00` LIMIT 0 , 30
Вот почему вы теряете любые записи, которые находятся между полуночью и теперь.
Используйте NOW()
:
SELECT * FROM votelog WHERE ipaddress = '127.0.0.1' AND datevoted BETWEEN DATE_SUB( NOW( ) , INTERVAL 24 HOUR ) AND NOW( ) LIMIT 0 , 30
Полезные данные:
Документация MySQL: типы DATETIME, DATE и TIMESTAMP
Документы MySQL: функции даты и времени
Вопрос SO: datetime vs timestamp