2012-10-27 13 views
5

Bir dükkanın çalışma saatleri içinde olup olmadığını anlamaya çalışıyorum, eğer açık değilse bir sonraki sefer seçin.Bir dahaki sefere iş bulun açık; mysql saat hesaplaması

Sonunda belirli bir tarihe kadar açılış gününü koymak gerekiyor.

olası Birisi bana nasıl bu sorguyu oluşturmak için bir ipucu verebilir misiniz? peşin

Teşekkür

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

Düzenleme:

Ben BİR özel mağazası için açık mağazalar, ama sadece açık saatini öğrenmek için aramıyorum biraz açıklığa kavuşturmak için. Açılış/kapanış saatine göre ve şimdi saat kaç. 15 dakika tarafından artırılan bazı seçilebilir zaman damgaları üreteceğim.

E.g. Bir mağaza kapanmışsa (1PM), bunun yerine bir sonraki açık günün açılış/kapanış saatini kullanmam gerekecek. (dükkan her gün açık değildir, pazar günleri kapalı olabilir).

+0

İmleç ihtiyacınız var mı? –

+0

Gerçekten bir imlecin ne için kullanıldığından emin değilim - temelde sadece belirli bir tarih için bir sonraki açılış ve kapanış saatlerini getirmem gerekiyor. – Kristian

+0

Kayıtlar nasıl görünüyor? İstediğiniz sonuçları da gönderebilir misiniz? – Ambrose

cevap

3

, o NOW()

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

Eski açıktır

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

Düzenleme 2:

bulmak için sonraki kullanılabilir 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` 

Düzenleme: Eğer day_of_week alanında ISO biçimini 1 = Monday ... 7 = Sunday kullanmak istiyorsanız

DATE_FORMAT(*DATE*, '%w'), sizi biçimi 0 = Sunday ... 6 = Saturday

kullanır php's date('N')'u sorgunuza bağlamalıdır (veya IF(DATE_FORMAT(NOW(), '%w') = 0, 7, DATE_FORMAT(NOW(), '%w')) işlevinde Mysql kullanmalıdır, ancak çirkin)

+0

Bir sonraki açık saatleri bulmak için, önce örnek 1'i kullanarak işe başlayacağım, eğer sonuçlar boşsa, aralık gününü artıran bir döngü oluşturacağım. Bu etkili midir? – Kristian

+0

Gerçekten etkili değil, ama, bir düzenleme için bekleyiniz – pozs

+0

Sabah saatlerinde 1AM'yi kontrol ederseniz, bu işe yaramayacağını aklınızdan çıkarmayın ve mağaza o gün saat 6'da açıktır; Diğer bir deyişle, yalnızca betiği çalıştırdığınızda açık olan dükkanları iade eder. –

2

1) Mağazanın açık olup olmadığını kontrol edin.

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

2) sonraki açık zaman bul:

(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; 

Untested, ancak haftanın bu gerektiği saygı hafta sonu sarma ve delikler (yani gün kapalı) dükkan kapatılırsa Sonucu, boş .

dayofweek() numaralarının 1 = Pazar, 2 = Pazartesi olduğunu aklınızda bulundurun: ... Tablonuz, hafta içi günlerini farklı bir biçimde depolarsa, sorguyu buna göre ayarlamanız gerekir.

yarın 's mevcut open_time ler bulmak için:: shop_id' s öğrenmek için

İlgili konular