これは、mysqlの日時から整数への暗黙的なキャストを行っているためです。
例えば。 mysqlは(私がこれを書いているように)時間は2011-12-15 13:42:10だと考えていますが、mysqlにこれから90を引くように依頼すると、20111215134210-90=20111215134120は13:41:20で50です数秒前。
時刻を整数として扱うか(liquorvicarによって提案されているようにUNIXタイムスタンプとの間で変換することにより)、日付関数を使用して日付値の計算を行います。
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;
(最後のフィルター式も書き直して、テーブルの列が式の片側で分離されるようにしました。これは、列がインデックス付けされていない場合は速度のメリットはわずかですが、インデックス付けされている場合は大きなメリットがあります)。
または、秒-since-epochを使用して....
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);
(これは明らかにインデックス最適化を使用できません)。