2012-10-27 7 views
5

私は店が開店時間内にあるかどうかを確認しようとしています。ビジネスが開いている次の時間を検索します。 mysqlの時間計算

最後に、開始日を特定の日付にする必要があります。

誰かがこのクエリを構成するヒントを教えてくれますか?事前に

おかげ

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'); 

編集:

私はONE特定の店のオープンのお店が、唯一のオープン時間を見つけるために探していないよ少しを明確にします。開閉時間に基づいて、今何時ですか。選択可能なタイムスタンプを15分増分して生成します。

など。店が閉店(1PM)している場合は、代わりに次のオープン日のオープン/クローズ時間を使用する必要があります。 (ショップは必ずしも毎日開いているわけではなく、日曜日は閉店する可能性があります)。

+0

あなたはカーソルが必要ですか? –

+0

私は正直なところ、カーソルが何のために使われているのかわかりません - 基本的には、次の営業時間や営業時間、特定の日付のフェッチが必要です。 – Kristian

+0

レコードはどのように見えますか?あなたが望む結果を投稿することはできますか? – Ambrose

答えて

3

shop_idさんを見つけるために、それはNOW()

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

廃止にオープンしています2:

検索するには、次の利用可能なopen_time S:

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` 

編集:あなたはday_of_weekフィールドにISO形式1 = Monday ... 7 = Sundayを使用したい場合は

DATE_FORMAT(*DATE*, '%w')は、あなたをフォーマット0 = Sunday ... 6 = Saturday

を使用していますあなたのクエリにPHPのdate('N')をバインドする必要があります(または関数IF(DATE_FORMAT(NOW(), '%w') = 0, 7, DATE_FORMAT(NOW(), '%w'))の場合はMysqlを使用しますが、それは醜い)

+0

次の営業時間を見つけるには、例1を使用して始めます。結果が空の場合は、間隔の日を増やすループを作成します。これは効果的ですか? – Kristian

+0

実際には効果がありませんが、編集を待つこと – pozs

+0

言うことを確認すると動作しません。朝1AMとその日は6AMで営業しています。言い換えれば、スクリプトを実行するときに開いている店舗のみを返します。 –

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 =月曜日、...テーブルが平日を別の形式で格納する場合は、それに応じてクエリを調整する必要があります。

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

編集:利用可能open_time明日年代を検索するに

関連する問題