2017-06-11 7 views
0

私は表tbl_Roomに列taken (boolean)を持ち、顧客は短期間この部屋を借りたいとします。タイムスタンプだけに依存するmysql dbカラムを更新するにはどうすればよいですか?

ここで、タイムスタンプに応じて、takenという値を自動的に変更するようにmysqlに指示できますか? g。レンタル期間/期間が終了した場合、takenの値は自動的にfalseに設定されます。

また、定期的にサーバー上で実行されるCRONやその他のスクリプトを使用してデータベースを更新する必要はありますか?

答えて

-1

あなたはjQueryの時間ピッカーを使用することができます。私はJavaScriptの時間関数が現在の時刻をチェックするifループを作成することができます...元の時間に...条件が満たされれば...変更できますmysqlは関数を取った

1

それを管理するためにmysqlイベントを使用してください。期間があれば

Reference

CREATE EVENT [IF NOT EXIST] event_name 
ON SCHEDULE schedule 
DO 
event_body 

event_bodyの下には、期間をチェックして、テーブルを更新するselect文を書くことができます。

1

このような時間ベースの要求を処理する最良の方法は、直感的ではありません。

特定の時刻にテーブルを更新しないでください。代わりに、lease_expires_atのようなタイムスタンプ列を含めます。

部屋を借りるときは、lease_expires_atの値をレンタル期間の有効期限に設定するように行を更新します。たとえば、今から始めて30分部屋を借りたら、これを行います。

UPDATE room 
    SET lease_expires_at = NOW() + INTERVAL 30 MINUTE 
    WHERE room_number = whatever 

あなたが部屋は、現在(NOW())であるかどうかを知りたい場合は取られ、これを行う:あなたが部屋は(NOW() + INTERVAL 60 MINUTE)今から一時間利用できるようになりますかどうかを知りたい場合は

SELECT room_number, 
     CASE WHEN lease_expires_at IS NULL THEN 0 
      WHEN lease_expires_at <= NOW() THEN 0 
      ELSE 1 END taken 
    FROM room 
    WHERE room = whatever 

SELECT room_number, 
     CASE WHEN lease_expires_at IS NULL THEN 0 
      WHEN lease_expires_at <= NOW() + INTERVAL 60 MINUTE THEN 0 
      ELSE 1 END taken 
    FROM room 
    WHERE room = whatever 

その後、たまにはなく、任意のタイムクリティカルな方法で、あなたはこの

のようなクエリを使用して物事をクリーンアップすることができます、これを行います
UPDATE room SET lease_expires = NULL WHERE lease_expires <= NOW() 

このクリーンアップを行うには、イベント、または夜間のcronjobなどを使用できます。アプリケーションの整合性は、このジョブがいつ実行されるかに依存しません。

takenの値を設定するために定期的に実行されているプロセスに依存していて、そのプロセスが実行されない、または遅く実行されると、結果が正しくありません。時間に頼ると、正確な結果が得られます。

このデザインには小さな境界条件の詳細があります。私の質問に<=を使用することによって、私はlease_expires_atタイムスタンプを、現在のリースの最後の瞬間ではなく、別のリースで利用できる最初の瞬間を表すように選択します。それは便利な選択です。2017-11-2017 11:00:00のようなものをlease_expires_atに入れれば、誰かが「11時に部屋を利用できるのですか?あなたは簡単に「はい」と言うことができるようにしたいと考えています。"10:30にレンタルした人は、11:00前の瞬間までそれを取得します。

関連する問題