Het is omdat je een impliciete cast uitvoert van een mysql datetime naar een geheel getal.
bijv. mysql denkt dat de tijd (terwijl ik dit schrijf) 2011-12-15 13:42:10 is, maar als ik mysql zou vragen om 90 hiervan af te trekken, zou het een training zijn van 20111215134210 - 90 =20111215134120, wat 13:41:20 is, wat 50 is seconden geleden.
Behandel de tijd als een geheel getal (door te converteren naar/van een Unix-tijdstempel, zoals voorgesteld door Liquvicar) of gebruik de datumfuncties om wiskunde op een datumwaarde uit te voeren:
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;
(merk op dat ik ook de laatste filterexpressie heb herschreven zodat de tabelkolom aan één kant van de expressie is geïsoleerd - wat een klein snelheidsvoordeel heeft wanneer de kolom niet is geïndexeerd, maar een enorm voordeel wanneer deze is geïndexeerd).
Of gebruik seconden-sinds-tijdperk....
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 uiteraard geen indexoptimalisatie kan gebruiken).