Itu karena Anda melakukan cast implisit dari datetime mysql ke integer.
Misalnya. mysql berpikir waktu (saat saya menulis ini) adalah 2011-12-15 13:42:10 tetapi jika saya meminta mysql untuk mengurangi 90 dari ini, itu akan melatih 20111215134210 - 90 =20111215134120 yaitu 13:41:20 Yaitu 50 detik yang lalu.
Perlakukan waktu sebagai bilangan bulat (dengan mengonversi ke/dari stempel waktu unix, seperti yang disarankan oleh liquorvicar) atau gunakan fungsi tanggal untuk menghitung nilai tanggal:
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;
(perhatikan bahwa saya juga telah menulis ulang ekspresi filter terakhir sehingga kolom tabel diisolasi di satu sisi ekspresi - yang memiliki manfaat kecepatan kecil ketika kolom juga tidak diindeks tetapi sangat bermanfaat ketika diindeks).
Atau menggunakan detik-sejak-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);
(yang jelas tidak akan dapat menggunakan pengoptimalan indeks).