5

お店が現在営業時間内にあるかどうかを調べようとしています。そうでない場合は、次回の営業時間を選択します。

最後に、開始日を特定の日付として設定できるようにする必要があります。

誰かがこのクエリを作成する方法を教えてもらえますか?

前もって感謝します

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

INSERT INTO `shop_hours` (`id`, `shop_id`, `day_of_week`, `open_time`, `close_time`)
VALUES
    (1, 1, 0, '08:00:00', '24:00:00'),
    (2, 1, 1, '08:00:00', '24:00:00'),
    (3, 1, 2, '08:00:00', '24:00:00'),
    (4, 1, 3, '08:00:00', '24:00:00'),
    (5, 1, 4, '08:00:00', '24:00:00'),
    (6, 1, 5, '08:00:00', '24:00:00'),
    (7, 1, 6, '08:00:00', '24:00:00');

編集:

少し明確にするために、私は開いている店を探しているのではなく、特定の店の営業時間のみを探しています。開店時間と閉店時間、および現在の時刻に基づきます。15 分刻みの選択可能なタイムスタンプをいくつか生成します。

たとえば、店が閉店したばかり (午後 1 時) の場合、代わりに次の開店日の開店/閉店時間を使用する必要があります。(お店は毎日開いているとは限りません。日曜定休の場合もあります)。

4

2 に答える 2

3

開いているshop_idを調べるにはNOW()

SELECT *
  FROM `shop_hours`
 WHERE `day_of_week` = DATE_FORMAT(NOW(), '%w')
   AND CURTIME() BETWEEN `open_time` AND `close_time`

廃止されました:

明日の利用可能なを見つけるにはopen_time:

SELECT *
  FROM `shop_hours`
 WHERE `day_of_week` = DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 1 DAY), '%w')

編集2:

次に利用可能な を見つけるにはopen_time:

  SELECT `shop_id`,
         MIN(CAST(CONCAT(DATE(DATE_ADD(NOW(), INTERVAL ((7 + DATE_FORMAT(NOW(), '%w') - `day_of_week`) % 7) DAY)), ' ', `open_time`) AS DATETIME)) AS `next_open_datetime`
    FROM `shop_hours`
GROUP BY `shop_id`

編集

DATE_FORMAT(*DATE*, '%w')フォーマットを使用します0 = Sunday ... 6 = Saturday

フィールドでISO 形式を使用する場合1 = Monday ... 7 = Sundayは、phpをクエリにバインドする必要があります (または、Mysql の if 関数を使用しますが、それは見苦しいです)。day_of_weekdate('N')IF(DATE_FORMAT(NOW(), '%w') = 0, 7, DATE_FORMAT(NOW(), '%w'))

于 2012-10-27T14:09:03.343 に答える
2

1) お店が開いているかどうかを確認します。店が閉まっている場合、結果は空です:

select * from shop_hours
where shop_id = $id
      and dayofweek(curdate()) = day_of_week
      and curtime() between open_time and close_time;

2) 次の営業時間を検索:

(select open_time from shop_hours
 where shop_id = $id and curtime() < open_time
       and day_of_week >= dayofweek(curdate()))
union
(select open_time from shop_hours
 where shop_id = $id and curtime() < open_time
 order by day_of_week)
 union
(select open_time from shop_hours
 where shop_id = $id and curtime() > close_time
       and day_of_week >= dayofweek(curdate()))
union
(select open_time from shop_hours
 where shop_id = $id and curtime() > close_time
 order by day_of_week)
limit 1;

テストされていませんが、これは週末のラップアラウンドと週の穴 (つまり、休業日) を尊重する必要があります。

dayofweek ()の数値は 1 = 日曜日、2 = 月曜日、... テーブルに平日が別の形式で格納されている場合は、それに応じてクエリを調整する必要があります。

于 2012-10-27T14:08:34.190 に答える