質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • MySQL

    6000questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

MySQLに営業時間を登録する

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 1,187

yui

score 27

飲食店情報サイトシステムを構築しております。
使用DBはMySQLです。

お店ごとに異なる「営業時間」の項目を格納するのに最適な型について、
いい案がありましたらご教授お願い致します。

A店(喫茶) 9:00〜18:00
B店(バー) 21:00〜翌3:00
C店(洋食店)11:00〜15:00、18:00〜22:00

営業時間は検索や現在時刻との連動に使用しますので、
varchar型で上記テキストのまま格納する事は避けたいです。

営業時間1・営業時間2 の様に2列になるのはOKです。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+3

店舗のテーブルと店舗別営業時間のテーブルを別にして、仮に営業時間が3分割されても大丈夫にする案も考えられます。

店舗

  • 店舗ID INT
  • 店舗名 VARCHAR

店舗別営業時間

  • 店舗ID INT
  • 開始時間 TIME
  • 終了時間 TIME

店舗別営業時間の方は、主キーを「店舗ID+開始時間」にしておくといいでしょうかね。その2つで重複はしないと思うので。


営業時間1 営業時間2 みたいなのは、ちょっと心が痛みます。


この方法のもう一つのメリットとしては、ちょっと冗長になりますが、

  • 店舗テーブルに「表示用営業時間」列を設ける
  • 「21:00~翌3:00」のような値をそこに入れる
  • 画面への表示ではこれを使用する
  • 店舗別営業時間では次の2行を登録する
  • 00:00 - 03:00
  • 21:00 - 24:00
  • 検索にはこれを使用する

このようにすることで、検索の SQL が少し簡単になることが期待できます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

イメージ説明
一択じゃないすかね…

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/30 17:45

    TIME型は00:00:00といった1つの時間のフォーマットのデータを格納するものですよね。
    「11:00〜15:00」といった形でのデータを登録するには最適では無いのでは?

    開始時刻を11:00、終了時刻を15:00で2列に分けるとすると、
    C店の例では営業時間だけで4列のカラムが必要になってしまい、
    どうにもスマートでは無い気がしまして・・

    キャンセル

  • 2015/07/30 18:37 編集

    正規化すればいいだけではありませんか?
    フォーマットだってできるんだし、秒があっても構わないはずです。

    > SELECT TIME_FORMAT(NOW(), '%H:%i');

    問題は午前0時を過ぎる終了時間をどうするかですね。

    キャンセル

  • 2015/07/30 19:03

    CREATE TABLE `shop` (
    `shop_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `shop_name` varchar(64) DEFAULT NULL,
    PRIMARY KEY (`shop_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

    INSERT INTO `shop` (`shop_id`, `shop_name`)
    VALUES
    (1, 'お店の名前');

    CREATE TABLE `timeschedule` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `shop_id` int(11) DEFAULT NULL,
    `open_time` time DEFAULT NULL,
    `close_time` time DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

    INSERT INTO `timeschedule` (`id`, `shop_id`, `open_time`, `close_time`)
    VALUES
    (1,1,'09:00:00','15:00:00'),
    (2,1,'17:30:00','23:30:00');

    取り出し方

    SELECT
    shop_name
    , group_concat(
    concat(
    time_format(open_time, '%H:%i')
    , '〜'
    , time_format(close_time, '%H:%i')
    )
    ORDER BY open_time ASC
    SEPARATOR ', '
    ) AS `eigyojikan`
    FROM
    `shop` SP
    LEFT JOIN
    `timeschedule` SC
    ON
    SP.shop_id=SC.shop_id
    GROUP BY
    SP.shop_id

    キャンセル

check解決した方法

-2

ご回答ありがとうございます。

ご参考にさせて頂きましたが、結果的には
データベース側には「10,18」「21,3」といった形でデータ登録を行い、
システム側で配列にて処理する事となりました。

ありがとうございましたm(__)m

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-3

飲食店等の場合は、昼の部、夜の部で2パターンの時間設定が必要かと思います。
その為、営業時間2つ登録出来るようにし、フラグ判定により終日営業か時間帯営業か区別するなどはいかがでしょうか?

データベースに、
営業時間帯判定フラグカラム(0:終日営業、1:昼夜営業(準備時間帯がある場合)、2:昼営業、3:夜営業)
営業時間帯(昼)カラムFrom~To(終日営業の場合は、昼の営業時間帯にデータを格納するなど決めうち)
営業時間帯(夜)カラムFrom~To

なんて思ったのですが・・・。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

関連した質問

  • 解決済

    MySQLについて

    MySQLについて質問です。 MySQLにてテーブルを作成したところなのですが、テーブルを作成した際のCREATE文を拡張子sqlのファイルで提出してほしいといわれたのですが、メモ

  • 解決済

    空の値でないデータを抽出するにはどうしたら良いのでしょうか

    初期的な質問ですいません。 以下のようなデータから、ランダムで3つデータを抜き出す時、mediaもgroupの値も「空でない」ものを抽出するにはどうしたら良いでしょうか? 片方でし

  • 解決済

    mysqlのtableの作り方について

    現在、mysqlを勉強中の者です。 下記をmysqlに入れようとすると 「1136 (21S01): Column count doesn't match value count

  • 解決済

    テーブル作成時の文法エラー

    こんにちは! 現在、データベースについて勉強しはじめました。 そこで、基本的と思われる文法エラーが出たのですが、MySQLのリファレンスを読んでも該当箇所がわからず解決しないため、

  • 解決済

    Homebrewの再インストールでエラーが発生してしまいます。

    MySQLでエラーが発生し、どうしてもそれが解決できなかったので ============= (1)MySQLとHomeBrewをアンインストール (Homebrewをアンインス

  • 解決済

    mysqlについて

    mysqlの設定を変えたいと思いmy cnfを探したのですが見つからず・・・ 原因は、サービスにmysqlが入っていなかったようなので、 C:\>cd \usr\mysql\bi

  • 解決済

    MySQLをMacのローカルで起動するにはどうすれば宜しいでしょうか?

    MySQLをMacのローカルで起動するにはどうすれば宜しいでしょうか? 手順が知りたいです・・・

  • 受付中

    mysql isloation levelとDeadLockエラー

    Mysqlの隔離レベルによってエラーの様子が変わってるのですが、なぜこのようなことが起きるのかわからずご質問します。 引用テキスト隔離レベルをREPEATABLE RE

同じタグがついた質問を見る

  • MySQL

    6000questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。