sql >> データベース >  >> RDS >> Mysql

困惑するphp/Mysql時間の算術動作

    これは、mysqlの日時から整数への暗黙的なキャストを行っているためです。

    例えば。 mysqlは(私がこれを書いているように)時間は2011-12-15 13:42:10だと考えていますが、mysqlにこれから90を引くように依頼すると、20111215134210-90=20111215134120は13:41:20で50です数秒前。

    時刻を整数として扱うか(liquorvicarによって提案されているようにUNIXタイムスタンプとの間で変換することにより)、日付関数を使用して日付値の計算を行います。

    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;
    

    (最後のフィルター式も書き直して、テーブルの列が式の片側で分離されるようにしました。これは、列がインデックス付けされていない場合は速度のメリットはわずかですが、インデックス付けされている場合は大きなメリットがあります)。

    または、秒-since-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);
    

    (これは明らかにインデックス最適化を使用できません)。



    1. SQL ServerのCHARINDEX()とPATINDEX()–違いは何ですか?

    2. MySQLで列の照合を表示する方法

    3. SQL Server:クエリは高速ですが、手順からは低速です

    4. MySQLとPostgreSQLDBをリバースエンジニアリングするためのアプリケーション?