Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verblüffendes arithmetisches Verhalten von PHP/Mysql Time

Das liegt daran, dass Sie eine implizite Umwandlung von einer mysql-Datetime in eine Ganzzahl durchführen.

Z.B. mysql denkt, dass die Zeit (während ich dies schreibe) 2011-12-15 13:42:10 ist, aber wenn ich mysql auffordere, 90 davon zu subtrahieren, würde es 20111215134210 - 90 =20111215134120 trainieren, was 13:41:20 ist, was 50 ist vor Sekunden.

Behandeln Sie die Zeit entweder als Ganzzahl (durch Konvertieren in/von einem Unix-Zeitstempel, wie von liquorvicar vorgeschlagen) oder verwenden Sie die Datumsfunktionen, um mit einem Datumswert zu rechnen:

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;

(Beachten Sie, dass ich auch den letzten Filterausdruck so umgeschrieben habe, dass die Tabellenspalte auf einer Seite des Ausdrucks isoliert ist - was einen kleinen Geschwindigkeitsvorteil hat, wenn die Spalte nicht indiziert ist, aber einen großen Vorteil, wenn sie indiziert ist).

Oder mit Sekunden seit Epoche....

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);

(die offensichtlich keine Indexoptimierung verwenden können).