Mysql
 sql >> база данни >  >> RDS >> Mysql

Смущаващо аритметично поведение на php/Mysql Time

Това е, защото правите имплицитно прехвърляне от mysql datetime към цяло число.

напр. mysql смята, че времето (докато пиша това) е 2011-12-15 13:42:10, но ако помоля mysql да извади 90 от това, ще работи 20111215134210 - 90 =20111215134120 Което е 13:5, което е 13:5 преди секунди.

Или третирайте времето като цяло число (чрез преобразуване към/от времеви печат на unix, както е предложено от liquorvicar) или използвайте функциите за дата, за да изчислите стойността на датата:

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;

(обърнете внимание, че пренаписах и последния израз на филтъра, така че колоната на таблицата да е изолирана от едната страна на израза - което има малка полза от скоростта, когато колоната не е индексирана, но огромна полза, когато е индексирана).

Или с помощта на секунди-от-епоха....

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

(което очевидно няма да може да използва оптимизация на индекса).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Подготвеният израз не работи със заявки за ALTER таблица

  2. Как да проверите дали стойността съществува в MySQL база данни

  3. Използвайки Prepared Statement, как да върна идентификатора на вмъкнатия ред?

  4. Случай на MySQL в оператор Select с оператор LIKE

  5. Laravel Sail възстановява базата данни по подразбиране