mySQL не удалось получить сообщения за последние 24 часа и последние 60 минут

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