2010-05-17 11 views
2

J'ai une table qui contient les colonnes suivantes:avec MySQL requête

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

chaque fois que quelque chose y est inséré, la colonne de temps devient horodatage en cours. Je souhaite exécuter une requête qui renvoie toutes les lignes qui ont été ajoutées au cours des dernières 24 heures. C'est ce que j'essaie d'exécuter:

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

Et ça ne marche pas. Quelqu'un peut-il m'aider? Merci :)

+2

Selon le manuel de mysql, l'unité doit être HEURE PAS HOURS. http://dev.mysql.com/doc/refman/5.1/fr/date-and-time-functions.html#function_timestampadd – mdma

+1

@MDMA - Je pense que vous avez la réponse, définitivement HEURE (au singulier) – amelvin

Répondre

4

HEURES devrait être HEURE. Voir la documentantion pour TIMESTAMPADD voir les valeurs valides du paramètre unit:

TIMESTAMPADD (unité, intervalle, datetime_expr)

Ajoute l'intervalle d'expression entière à la date ou l'expression datetime datetime_expr. L'unité pour interval est donnée par l'argument unit, qui doit être l'une des valeurs suivantes: FRAC_SECOND (microsecondes), SECOND, MINUTE, HEURE, JOUR, SEMAINE, MOIS, QUART ou ANNÉE.

Ainsi, votre requête doit être:

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

Notez également que cette requête ne sera pas en mesure de tirer parti d'un indice sur le temps, le cas échéant. Il pourrait être plus efficace de réécrire la requête comme suit:

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

+1 Parfois, la lecture la question (soigneusement) aide! – amelvin

1

Utilisez date time functions de MySQL

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

je suppose que cela utilisera un index sur 'time', alors que comparer timestampdiff (xxx, curdate(), time) ne le ferait pas, n'est-ce pas? – araqnid

+0

@araqnid: Oui, si un index existe, cette requête peut l'utiliser. Ceci s'applique à cette réponse, ma deuxième suggestion, la réponse de Salman A et celle de Paul G. –

0

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

TIMESTAMPADD (unité, intervalle, datetime_expr)

Ajoute l'intervalle d'expression entier à l'expression de date ou de date datetime_expr. L'unité de l'intervalle est donnée par l'argument de l'unité, qui doit être une des valeurs suivantes: FRAC_SECOND (microsecondes), SECOND, minute, heure, jour, semaine, mois, trimestre ou année.

Depuis MySQL 5.1.24, il est possible d'utiliser MICROSECOND en place de FRAC_SECOND avec cette fonction, et FRAC_SECOND est dépréciée. FRAC_SECOND est supprimé dans MySQL 5.5.

La valeur unitaire peut être spécifiée en utilisant un des mots-clés comme indiqué, ou avec un préfixe de SQL_TSI_. Par exemple, DAY et SQL_TSI_DAY sont tous deux autorisés.

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

-> '02.01.2003 00:01:00'

mysql> SELECT TIMESTAMPADD (semaine, 1, '02/01/2003');

-> '2003-01-09'

Alors ...

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

devrait être ce que vous voulez

1

Vous voudrez peut-être envisager de le faire dans l'autre sens . Plutôt que de soustraire 24 heures de chaque fois, calculez l'heure il y a 24 heures (une fois), puis vérifiez vos valeurs de temps par rapport à cela. Très probablement plus optimale, bien que je ne suis pas trop familier 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 

Cela suppose que vous n'avez pas temps de « futurs » dans votre table. Si tel est le cas, ajoutez ceci à votre clause where:

AND time <= NOW()