Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Ghép kênh php / Mysql Hành vi số học thời gian

Đó 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).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lập trình lớp PHP PDO:Lỗi nghiêm trọng:Gọi hàm thành viên fetchAll () trên boolean

  2. Chuyển đổi đầu ra của truy vấn MySQL thành utf8

  3. MySQL ROUND () Hàm - Làm tròn một số đến một số vị trí thập phân cho trước

  4. Làm thế nào để gọi một thủ tục được lưu trữ mysql, với các đối số, từ dòng lệnh?

  5. Cách sử dụng JDBC để kết nối cơ sở dữ liệu MySql