Dzieje się tak, ponieważ robisz niejawne rzutowanie z mysql datetime na liczbę całkowitą.
Np. mysql uważa, że czas (jak to piszę) to 2011-12-15 13:42:10, ale gdybym poprosił mysql o odjęcie 90 od tego, wyszłoby 20111215134210 - 90 =20111215134120 czyli 13:41:20 czyli 50 kilka sekund temu.
Traktuj czas jako liczbę całkowitą (konwertując do/z uniksowego znacznika czasu, zgodnie z sugestią liquorvicar) lub użyj funkcji daty, aby wykonać obliczenia matematyczne na wartości daty:
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;
(zauważ, że przepisałem również ostatnie wyrażenie filtrujące, tak że kolumna tabeli jest izolowana po jednej stronie wyrażenia - co ma niewielką korzyść w zakresie szybkości, gdy kolumna nie jest indeksowana, ale ogromną korzyść, gdy jest indeksowana).
Lub za pomocą sekund-od-epoki....
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);
(co oczywiście nie będzie mogło korzystać z optymalizacji indeksu).