Je to proto, že provádíte implicitní přetypování z mysql datetime na celé číslo.
Např. mysql si myslí, že čas (když to píšu) je 2011-12-15 13:42:10, ale kdybych požádal mysql, aby od toho odečetl 90, bylo by to cvičení 20111215134210 - 90 =20111215134120, což je 1:203:před sekundami.
Buď zacházejte s časem jako s celým číslem (převedením do/z unixového časového razítka, jak navrhuje liquorvicar), nebo použijte funkce data k počítání s hodnotou data:
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;
(Všimněte si, že jsem také přepsal poslední výraz filtru tak, že sloupec tabulky je izolován na jedné straně výrazu - což má malou výhodu rychlosti, když sloupec není indexován, ale obrovskou výhodu, když je indexován).
Nebo pomocí sekund-od-epochy....
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);
(který samozřejmě nebude moci používat optimalizaci indexu).