Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comportement arithmétique php/Mysql Time déconcertant

C'est parce que vous faites un cast implicite d'un datetime mysql vers un entier.

Par exemple. mysql pense que l'heure (au moment où j'écris ceci) est 2011-12-15 13:42:10 mais si je demandais à mysql de soustraire 90 de cela, cela entraînerait 20111215134210 - 90 =20111215134120 qui est 13:41:20 Qui est 50 il y a quelques secondes.

Soit traitez l'heure comme un entier (en convertissant vers/à partir d'un horodatage unix, comme suggéré par liquorvicar) ou utilisez les fonctions de date pour faire des calculs sur une valeur de date :

SELECT *, 
timediff(NOW(), attempt_time) diff, 
timediff(NOW(), attempt_time + INTERVAL 90 SECONDS) pending,
NOW() nw 
FROM failed_login 
WHERE (username = 'some_username' 
     OR attempt_ip = '127.0.0.1') 
AND NOW() - INTERVAL 90 SECONDS > attempt_time;

(notez que j'ai également réécrit la dernière expression de filtre de sorte que la colonne de la table soit isolée d'un côté de l'expression - ce qui présente un petit avantage en termes de vitesse lorsque la colonne n'est pas indexée, mais un énorme avantage lorsqu'elle est indexée).

Ou en utilisant les secondes depuis l'époque...

SELECT *, 
UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(attempt_time) diff, 
UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(attempt_time) + 90 pending,
NOW() nw 
FROM failed_login 
WHERE (username = 'some_username' 
     OR attempt_ip = '127.0.0.1') 
AND UNIX_TIMESTAMP(NOW()) - 90 > UNIX_TIMESTAMP(attempt_time);

(qui évidemment ne pourra pas utiliser l'optimisation de l'index).