2012-10-27 29 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分鐘。

E.g.如果一家商店剛剛關門(下午1點),我將需要使用下一個開放日的開門/關門時間。 (該店不一定每天都營業,週日可能關閉)。

+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` 

過時

要找到明天的可用open_time S:

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

編輯 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` 

編輯

DATE_FORMAT(*DATE*, '%w')使用格式0 = Sunday ... 6 = Saturday

如果你想使用ISO格式1 = Monday ... 7 = Sundayday_of_week領域,你應該將php的date('N')綁定到您的查詢中(或者使用Mysql的if函數IF(DATE_FORMAT(NOW(), '%w') = 0, 7, DATE_FORMAT(NOW(), '%w')),但這是難看)

+0

因此,要找到下一個營業時間,我首先通過使用示例1開始,如果結果爲空,我將創建一個循環增加間隔日。這有效嗎? – Kristian

+0

不是很有效,但是,等待編輯 – pozs

+0

請記住,如果您在早上1點檢查並且該店在當天上午6點開放,那麼這將不起作用;換句話說,它只會返回在運行腳本時打開的那些商店。 –

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 =星期一,......如果您的表格以不同格式存儲工作日,則必須相應地調整查詢。