MySQL не удалось получить сообщения за последние 24 часа и последние 60 минут - PullRequest
0 голосов
/ 03 сентября 2011

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 строки, 3 из которых подпадают под 24-часовое предложение.

Редактировать

Хорошо, так что я разобрался в своей проблеме: 1 Im до чертаустал .. 2 Ужасное использование Between и Date_Sub .. До меня не дошло, что я должен был использовать имя col, где у меня есть CURDATE (), чтобы ответить на мой собственный вопрос ниже.

thisтак выглядит временная метка в БД, стандартная DATETIME.

Ответы [ 5 ]

3 голосов
/ 03 сентября 2011

Вы не используете BETWEEN правильно, правильный синтаксис:

expr МЕЖДУ min И max

вам следует изменить конец запроса на:

...BETWEEN DATE_SUB(CURDATE(), INTERVAL 24 hour) AND CURDATE()

или используйте оператор >.

1 голос
/ 03 сентября 2011

Вы пробовали это?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)"; 
1 голос
/ 03 сентября 2011
$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'].

0 голосов
/ 03 сентября 2011

Возможно, у вас нет даты, но есть поле даты и времени (или отметка времени, которая немного отличается). Не используйте CURDATE(). В вашем запросе CURDATE() дает 2011-09-03 (дата!), И при сравнении с вашим полем даты и времени он обрабатывается как 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 docs: Типы DATETIME, DATE и TIMESTAMP

Документы MySQL: Функции даты и времени

ТАК вопрос: дата-время против отметки времени

0 голосов
/ 03 сентября 2011
SELECT *
FROM votelog
WHERE ipaddress = '127.0.0.1'
AND 
DATE_SUB( datevoted , INTERVAL 24 HOUR )
LIMIT 0 , 30

Так что после долгих раздумий это мой результат ... сейчас я чувствую себя грязно ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...