2010-05-17 2 views
2

У меня есть таблица, которая содержит следующие графы:Помощь с MySQL запроса

ip(varchar 255), index(bigint 20), time(timestamp) 

каждый раз, когда что-то вставляется там, колонка времени получает текущую временную метку. Я хочу запустить запрос, который возвращает все строки, которые были добавлены за последние 24 часа. Это то, что я пытаюсь выполнить:

SELECT ip, index FROM users WHERE ip = 'some ip' AND TIMESTAMPDIFF(HOURS,time,NOW()) < 24 

И это не работает. Может кто-нибудь помочь мне? Спасибо :)

+2

Согласно руководству mysql, устройство должно быть HOUR, а не HOURS. http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_timestampadd – mdma

+1

@MDMA - Я думаю, что у вас есть ответ, определенно HOUR (единственное) – amelvin

ответ

4

ЧАСЫ должны быть ЧАСЫ. Смотрите documentantion для TIMESTAMPADD, чтобы увидеть действительные значения параметра unit:

TIMESTAMPADD (единица измерения, интервал, datetime_expr)

добавляет интервал целого выражения на дату или дату и время экспрессии datetime_expr. Единица для интервала задается аргументом unit, который должен быть одним из следующих значений: FRAC_SECOND (микросекунды), SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER или YEAR.

Таким образом, ваш запрос должен быть:

SELECT ip, index 
FROM users 
WHERE ip = 'some ip' 
AND TIMESTAMPDIFF(HOUR, time, NOW()) < 24 

Заметим также, что этот запрос не сможет воспользоваться индексом по времени, если таковой существует. Это может быть более эффективным, чтобы переписать запрос следующим образом:

SELECT ip, index 
FROM users 
WHERE ip = 'some ip' 
AND time > NOW() - interval 1 day 
+0

+1 Иногда чтение вопрос (осторожно) помогает! – amelvin

1

Использование date time functions из MySQL

SELECT something FROM tbl_name 
    WHERE DATE_SUB(CURDATE(),INTERVAL 1 DAY) <= time; 
+0

Я бы предположил, что это фактически будет использовать индекс на 'time', тогда как сравнение timestampdiff (xxx, curdate(), time) с константой не будет, я прав? – araqnid

+0

@araqnid: Да, если индекс существует, этот запрос может его использовать. Это касается этого ответа, моего второго предложения, ответа Салмана А и Пола Г. –

0

От http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_timediff

TIMESTAMPADD (единица измерения, интервал, datetime_expr)

Добавляет целочисленный интервал выражения к дате или выражению даты и времени datetime_expr. Блок для интервала задается единичным аргументом, который должен быть одним из следующих значений: FRAC_SECOND (микросекунды), второй, минута, час, день, неделю, месяц, квартал, или год.

Начиная с MySQL 5.1.24, то можно использовать микросекунды вместо из FRAC_SECOND с этой функцией, и FRAC_SECOND устарела. FRAC_SECOND удален в MySQL 5.5.

Значение единицы может быть указано с использованием одного из ключевых слов, как показано, или с префиксом SQL_TSI_. Например, DAY и SQL_TSI_DAY оба являются законными.

mysql> SELECT TIMESTAMPADD (MINUTE, 1, '2003-01-02');

-> '2003-01-02 00:01:00'

MySQL> SELECT TIMESTAMPADD (неделя, 1, '2003-01-02');

-> '2003-01-09'

Итак ...

SELECT TIMESTAMPADD(DAY,-1,CURRENT_TIMESTAMP()); 

должно быть то, что вы хотите

1

Вы могли бы хотеть рассмотреть возможность сделать это наоборот , Вместо того, чтобы вычитать 24 часа каждый раз, вычислите время 24 часа назад (один раз), а затем проверьте свои значения времени на это. Весьма вероятно, более оптимальным, хотя я не слишком хорошо знакомы с MYSQL

SELECT ip, index FROM users WHERE ip = 'some ip' AND time > DATE_SUB(NOW(), HOUR, 24) 
1
SELECT ip, index 
FROM users 
WHERE ip = 'some ip' 
AND time >= NOW() - INTERVAL 24 HOUR 

Это предполагает, что вы не имеете «будущее» раз в вашей таблице. Если есть, добавьте это к своему предложению:

AND time <= NOW() 
Смежные вопросы