質問: **お店の営業開始終了時刻をMySQLへ格納したいのですが、データ型は何が良いでしょうか?** ・とりあえずvarchar指定したのですが、時間なのでtime型へ変更した方が良い? ・time型へ変更するメリットはあるでしょうか? ※time型を一度も使用したことがないのですが、どういう時に使用するデータ型なのでしょうか? --- **時刻をデータベースへ格納する時、「:」も含めるのでしょうか?** ・それとも外す? ``` 10:00 ``` もしくは ``` 1000 ``` --- **24時を過ぎた時刻の格納について** ・例えば26時閉店の場合、02:00でデータ格納した方が良いのでしょうか? ・当初は26:00をそのまま格納しようと思ったのですが、フォームを下記にしたら24:00以降に指定できないことに気が付いたので ・加工すれば格納可能だと思うのですが、一般的にプログラムの世界では24:00以降でデータを持たない(00:00~24:00間へ変換して保存する)のでしょうか? ``` ``` ・それぞれメリットデメリット等あれば教えてください
回答: 人により回答が異なるかもしれませんが... 私なら0:00からの経過時間で格納すると思います。 INT型(ミリ秒)、TIME型のどちらでもよいと思います。 TIME型は、O/Rマッパーを使用していれば、プログラミング言語に対応したTIME型のオブジェクトとして取得できるかと思います。 主な利点は以下の通りです。 * データがUIの表示フォーマットに依存しない + 時間の表記はアプリ側で自由に変更可能 + つまり多言語化対応などがしやすい * 各種言語の日時型と親和性が高い + 特定の日の0:00に加算すれば、その日の開店時間 / 閉店時間になる + 現在時刻から閉店までの時間を算出したりなど * SQL上で比較可能 + ある店舗より閉店時間の遅い店舗の抽出など * 差を取れば何時間営業なのか取得できる + SQL上では`TIMEDIFF(expr1,expr2)`で計算できます > > 24時を過ぎた時刻の格納について > > > DB設計ではなくUIなので要件によるかと思います。 閉店時間に開店時間より小さい時間が入力されていた場合、閉店時間に24時間加算するとかでしょうか? (開店時間 = 閉店時間の場合は24時間営業) UIで開店時間と閉店時間が変更されたタイミングで`(n時間営業)`みたいな表示を隣に出せば混乱もなさそうな気はします。 (23時~翌22時のような時間を設定できてしまうことやこのUIの良し悪しなど、要件によります) いずれにしてもDBへ26時のデータが格納されていたとしても、表示時には26時とも2時とも表示することはできます。 > > ※time型を一度も使用したことがないのですが、どういう時に使用するデータ型なのでしょうか? > > > 単純に時間(`HHH:MM:SS`)を格納するためのデータ型です。 11.3.2 TIME 型 > > MySQL では、TIME 値の取り出しと表示は 'HH:MM:SS' 形式 (時間の部分の値が大きい場合は 'HHH:MM:SS' 形式) で行われます。TIME 値の範囲は、'-838:59:59' から '838:59:59' です。TIME 型は、時間 (24 時間以下にする必要があります) を表すだけでなく、経過時間や、2 つのイベント間の時間 (24 時間よりも非常に長くなる場合も、負になる場合もあります) を表すこともできるので、時間の部分は非常に大きくなる可能性があります。 > > >