bugfix> mysql > 投稿

pingをチェックし、SQLからIPアドレスを取得する簡単なコードを実行しています。

私は今日見なかった人だけのためにコードを実行したいので、それを実行するたびに、彼はすでに答えを得たIPアドレスをリストから削除しますが、MySQLコマンドは私のために機能していません。

これは私が見つけたコマンドです:

select
IP
From 
database.devices
where DATE(LastConnected) != Date((now))

データベースに保存するデータは、次の形式を使用しています。

25-may-18 14:30:21
dd-mm-yy hh:mm:ss

なにが問題ですか?たぶん私は日付だけを取る必要がありますか? 25.5.18?もしそうなら-どうすればこれを行うことができますか?

回答 2 件
  • You make a mistake in **Date((now))** instead of **Date(now())** 
    Try this:Given all record instead of today
    select IP From database.devices where DATE(LastConnected) != Date(now())
    Given all record of today
    select IP From database.devices where DATE(LastConnected) = Date(now())
    
    

  • この形式を使用して"datetime値を文字列型として保存しているように聞こえます(例: VARCHAR )MySQL DATETIME を使用するのではなく  日時値を格納するために意図的に設計されたデータ型。 (しかし、私は「この形式を使用して「そして、奇妙なdd-Monthname-two_digit_yearは保証されています。)


    MySQLの日付/日付時刻操作を使用する場合は、文字列値を実際の DATETIME に変換できます   STR_TO_DATE を使用したdataype  関数。

    また、選択リストで式をテストできるため、実際に何が起こっているかを確認できます...

    SELECT d.lastconnected
         , STR_TO_DATE(d.lastconnected,'%d-%b-%y %T') AS lc_datetime_
         , DATE(NOW())
         , DATE(NOW()) + INTERVAL 1 DAY
    FROM database.devices
    
    

    式をテストしたら、それらをWHERE句で使用できます

    現在の日付の「日時」を表すlastconnected文字列を持つ行を返すには、次のようにします。

    SELECT d.lastconnected
         , STR_TO_DATE(d.lastconnected,'%d-%b-%y %T') AS lc_datetime_
         , ... 
      FROM database.devices d
     WHERE STR_TO_DATE(d.lastconnected,'%d-%b-%y %T') >= DATE(NOW()) + INTERVAL 0 DAY
       AND STR_TO_DATE(d.lastconnected,'%d-%b-%y %T')  < DATE(NOW()) + INTERVAL 1 DAY
    
    

    dt_lastconnected の場合   DATETIME でした  列では、クエリは dt_lastconnected を持つインデックスに対して効率的な範囲スキャン操作を使用できます  先行列として:

    SELECT ... 
      FROM database.devices d
     WHERE d.dt_lastconnected  >= DATE(NOW()) + INTERVAL 0 DAY
       AND d.dt_lastconnected   < DATE(NOW()) + INTERVAL 1 DAY
    
    

    Q:変更した場合...データ型 [最後に接続された列]テーブルの上-データはどうなりますか?再入力する必要がありますか?それとも、それを単独で変更しますか?

    lastconnected列の内容が「消去」されるのを避けるために、適切なタイプの別の列を追加し、既存の列から値を設定できます。

    テーブルが適切なサイズの行のセットである場合、次のようにすることができます

    ALTER TABLE database.device ADD dt_lastconnected DATETIME
    ;
    UPDATE database.device
       SET dt_lastconnected = STR_TO_DATE(d.lastconnected,'%d-%b-%y %T')
    ;
    
    

    これにより、可能な値はすべて変換されます。 lastconnected を含む行  有効な日時に解析できない値は dt_lastconnected になります  NULLに設定します。

    INSERTステートメントに新しい列を追加する場合は、適切な形式 YYYY-MM-DD HH:MI:SS で値を提供する必要があります。  例えば

    INSERT INTO databases.device ( ... , dt_lastconnected , ... ) VALUES
      ( ... , '2018-05-25 18:35:15' , ... )
    , ( ... , STR_TO_DATE('25-May-2018 18:35:15','%d-%b-%y %T') , ... )
    , ( ... , NOW() , ... )
    
    

    INSERTコードを修正したら、文字列列を削除し、新しい列の名前を変更できます。 ( lastconnected の場合、これはより複雑になります  インデックスの列です。)

    -- remove old column
    ALTER TABLE databases.devices
      DROP lastconnected ;
    -- rename column
    ALTER TABLE databases.devices
      CHANGE dt_lastconnected lastconnected DATETIME ;
    
    

あなたの答え