2012-11-12 6 views
6

私はdbフィールドに時間を保存する方法が必要です。私は顧客が特定の開始日から広告を表示する時間を選択できるウェブサイトを構築しています。TIMEの範囲を超えるMySQLで時間間隔を保存するにはどうすればよいですか?

私はTIMEを使用することを考えていましたが、それは約34日間で動作する '838:59:59'の最大値を持っています。その可能性は、クライアントがそれより長い間広告が存在することを望む可能性があります。

これに対処するにはどうすればよいでしょうか?ちょうど本当に大きなINT?

+0

開始時刻と終了時刻を2列に記録しないのはなぜですか? – eggyal

+0

これは私の元々の計画でしたが、ウェブサイトの他の側面を理解しようとするとかなり混乱していることが判明しました。 – cosmicsafari

+0

あなたはどのユニットにあなたのデュレーションを保存しますか?秒ですか?分?日々?それはあなたがデータタイプを決めるのを助けることができます – mwangi

答えて

6

開始時間と継続時間の列を使用する予定の場合は、秒単位で格納できると思います。だから、私はあなたがこのようなことをすると思います。あなたの広告への鍵ポインティング

  • のstart_time - -

    +-----------+--------------------------+------------------+ 
    | advert_id | start_time    | duration_seconds | 
    +-----------+--------------------------+------------------+ 
    | 2342342 |'2012-11-12 10:23:03'  | 86400   | 
    +-----------+--------------------------+------------------+ 
    

    (例のために、私たちはこのテーブルadvertsと呼びます)

    1. advert_id広告を開始すべき時間(データ型 - TIMESTAMP)
    2. DURATION_SECONDS - 広告を "ライブ"(INTEGER(11)

      Sなっていることを時間(秒) 'time_difference_in_seconds_since_advert_started'としてELECT TIME_TO_SEC(timediff(now()、start_time))からadverts;

    期限切れになっていない広告のみを取得する場合は、このようなクエリを実行します。

    SELECT * FROM `adverts` WHERE TIME_TO_SEC(timediff(now(),start_time))<=`duration_seconds`; 
    

    これは、「期間」フィールドを使用するとすれば、それを行う方法の1つです。

  • +1

    これはまさに私が話しているものですが、そうするのではなく、それを格納するのに最良のフィールドタイプが何であるかともっと関係していました。上記のDevArtとして、BIGINTを使用してTIMEの範囲の問題を回避することができます。答えがありがとう、非常によく書かれています。^_^ – cosmicsafari

    +0

    Ok cosmicsafari。それを正解として選択することを忘れないでください;) – mwangi

    0

    最高の解決策ではありませんが、データベースに1つの列を追加して、24時間を超える時間をチェックし、1日として計算し、その列に書き込み、残りのすべての時間を書き込みます。しかし、dbから選択すると、その列も計算する必要があります

    1

    はい、INTデータ型(または別の大きな整数:MEDIUMINT、LONGINT)として時間を格納できます。それから、あなたは簡単に曜日や時間を取得することができます。 -

    SELECT time DIV 86400 AS days, SEC_TO_TIME(column1 MOD 86400) AS time FROM table 
    

    ここで、86400は、24時間(60 * 60 * 24 = 86400)の秒数です。

    関連する問題