Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Perilaku aritmatika Waktu php/Mysql yang membingungkan

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menjalankan AMP (apache mysql php) di Android

  2. menampilkan tautan di php

  3. Bagaimana cara menghasilkan migrasi secara otomatis dengan Sequelize CLI dari model Sequelize?

  4. Menggunakan Mesin Penyimpanan MySQL yang Berbeda dalam Desain Basis Data

  5. Performa kueri LIKE pada jutaan tabel baris, MySQL