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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

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

Q&A

解決済

4回答

3828閲覧

MySQLに営業時間を登録する

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

0グッド

2クリップ

投稿2015/07/30 08:12

飲食店情報サイトシステムを構築しております。
使用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です。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

店舗のテーブルと店舗別営業時間のテーブルを別にして、仮に営業時間が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 が少し簡単になることが期待できます。

投稿2015/07/30 09:02

編集2015/07/30 09:45
ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

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

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

投稿2015/08/05 01:16

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

投稿2015/07/30 08:50

takayukiinaba

総合スコア1158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

イメージ説明

一択じゃないすかね…

投稿2015/07/30 08:38

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/07/30 08:45

TIME型は00:00:00といった1つの時間のフォーマットのデータを格納するものですよね。 「11:00〜15:00」といった形でのデータを登録するには最適では無いのでは? 開始時刻を11:00、終了時刻を15:00で2列に分けるとすると、 C店の例では営業時間だけで4列のカラムが必要になってしまい、 どうにもスマートでは無い気がしまして・・
退会済みユーザー

退会済みユーザー

2015/07/30 09:43 編集

正規化すればいいだけではありませんか? フォーマットだってできるんだし、秒があっても構わないはずです。 > SELECT TIME_FORMAT(NOW(), '%H:%i'); 問題は午前0時を過ぎる終了時間をどうするかですね。
退会済みユーザー

退会済みユーザー

2015/07/30 10: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
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問