27278


**お店の営業開始終了時刻をMySQLへ格納したいのですが、データ型は何が良いでしょうか？**  
・とりあえずvarchar指定したのですが、時間なのでtime型へ変更した方が良い？  
・time型へ変更するメリットはあるでしょうか？  
※time型を一度も使用したことがないのですが、どういう時に使用するデータ型なのでしょうか？

* * *

**時刻をデータベースへ格納する時、「:」も含めるのでしょうか？**  
・それとも外す？

[code]

    10：00
    
[/code]

もしくは

[code]

    1000
    
[/code]

* * *

**24時を過ぎた時刻の格納について**  
・例えば26時閉店の場合、02:00でデータ格納した方が良いのでしょうか？

・当初は26:00をそのまま格納しようと思ったのですが、フォームを下記にしたら24:00以降に指定できないことに気が付いたので  
・加工すれば格納可能だと思うのですが、一般的にプログラムの世界では24:00以降でデータを持たない(00:00～24:00間へ変換して保存する)のでしょうか？

[code]

    <input type="time">
    
[/code]

・それぞれメリットデメリット等あれば教えてください


CC BY-SA 3.0
2016-07-02T15:06:15.597
27277
2016-07-02T17:05:33.493
2016-07-02T16:21:53.320
10492
7886
question
mysql データベース設計
お店の営業開始終了時刻をデータベースへ格納したいのですが、データ型は何が良い？


人により回答が異なるかもしれませんが…

私なら0:00からの経過時間で格納すると思います。  
INT型(ミリ秒)、TIME型のどちらでもよいと思います。

TIME型は、O/Rマッパーを使用していれば、プログラミング言語に対応したTIME型のオブジェクトとして取得できるかと思います。

主な利点は以下の通りです。

  * データがUIの表示フォーマットに依存しない 
    * 時間の表記はアプリ側で自由に変更可能
    * つまり多言語化対応などがしやすい
  * 各種言語の日時型と親和性が高い 
    * 特定の日の0:00に加算すれば、その日の開店時間 / 閉店時間になる
    * 現在時刻から閉店までの時間を算出したりなど
  * SQL上で比較可能 
    * ある店舗より閉店時間の遅い店舗の抽出など
  * 差を取れば何時間営業なのか取得できる 
    * SQL上では[`TIMEDIFF(expr1,expr2)`](https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-functions.html#function_timediff)で計算できます

* * *

> 24時を過ぎた時刻の格納について

DB設計ではなくUIなので要件によるかと思います。

閉店時間に開店時間より小さい時間が入力されていた場合、閉店時間に24時間加算するとかでしょうか？  
(開店時間 = 閉店時間の場合は24時間営業)

UIで開店時間と閉店時間が変更されたタイミングで`(n時間営業)`みたいな表示を隣に出せば混乱もなさそうな気はします。  
(23時～翌22時のような時間を設定できてしまうことやこのUIの良し悪しなど、要件によります)

いずれにしてもDBへ26時のデータが格納されていたとしても、表示時には26時とも2時とも表示することはできます。

* * *

> ※time型を一度も使用したことがないのですが、どういう時に使用するデータ型なのでしょうか？

単純に時間(`HHH:MM:SS`)を格納するためのデータ型です。

11.3.2 TIME 型  
<https://dev.mysql.com/doc/refman/5.6/ja/time.html>

> MySQL では、TIME 値の取り出しと表示は 'HH:MM:SS' 形式 (時間の部分の値が大きい場合は 'HHH:MM:SS' 形式)
> で行われます。TIME 値の範囲は、'-838:59:59' から '838:59:59' です。TIME 型は、時間 (24
> 時間以下にする必要があります) を表すだけでなく、経過時間や、2 つのイベント間の時間 (24 時間よりも非常に長くなる場合も、負になる場合もあります)
> を表すこともできるので、時間の部分は非常に大きくなる可能性があります。


CC BY-SA 3.0
2016-07-02T17:05:33.493
27278
2016-07-02T17:05:33.493
3068
27277
answer