Помогите с запросом MySQL - PullRequest
2 голосов
/ 17 мая 2010

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

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 17 мая 2010

ЧАСОВ должно быть ЧАС. См. Документацию для 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
1 голос
/ 17 мая 2010
SELECT ip, index
FROM users
WHERE ip = 'some ip'
AND time >= NOW() - INTERVAL 24 HOUR

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

AND time <= NOW()
1 голос
/ 17 мая 2010

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

SELECT ip, index FROM users WHERE ip = 'some ip' AND time > DATE_SUB(NOW(), HOUR, 24)
1 голос
/ 17 мая 2010

Использование функций даты и времени из mysql

SELECT something FROM tbl_name
    WHERE DATE_SUB(CURDATE(),INTERVAL 1 DAY) <= time;
0 голосов
/ 17 мая 2010

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

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

Добавляет интервал целочисленных выражений к дате или выражению даты и времени datetime_expr. Блок для интервала задается единичным аргументом, который должно быть одно из следующих значений: FRAC_SECOND (микросекунды), SECOND, МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, или ГОД.

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

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

mysql> SELECT TIMESTAMPADD (МИНУТА, 1, '2003-01-02');

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

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

-> '2003-01-09'

Итак ...

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

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

...