Đó là bởi vì bạn đang thực hiện truyền ngầm từ datetime của mysql thành một số nguyên.
Ví dụ. mysql cho rằng thời gian (như tôi viết thế này) là 2011/12/15 13:42:10 nhưng nếu tôi yêu cầu mysql trừ đi 90, thì nó sẽ tập ra 20111215134210 - 90 =20111215134120 là 13:41:20 Đó là 50 vài giây trước.
Hãy coi thời gian là một số nguyên (bằng cách chuyển đổi thành / từ một dấu thời gian unix, như được đề xuất bởi winevicar) hoặc sử dụng các hàm ngày để làm toán trên một giá trị ngày:
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;
(lưu ý rằng tôi cũng đã viết lại biểu thức bộ lọc cuối cùng sao cho cột bảng được tách biệt ở một bên của biểu thức - điều này có lợi ích về tốc độ nhỏ khi cột cũng không được lập chỉ mục nhưng lại mang lại lợi ích rất lớn khi nó được lập chỉ mục).
Hoặc sử dụng giây kể từ kỷ nguyên ....
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);
(rõ ràng là sẽ không thể sử dụng tối ưu hóa chỉ mục).