2010-10-11 104 views
3

我有一个应用程序存储餐厅开放时间:MySQL之间的时间间隔

我的代码来获取当前打开的餐厅。我的SQL查询(简体)看起来像

SELECT * 
    FROM `restaurants` r 
WHERE r.from <= NOW() 
    AND r.to >= NOW(); 

这里的问题是,还有其翻转的条目 - 这是从上午11点开一家饭馆凌晨3点的第二天。

什么是一个很好的查询来捕捉特定的餐厅?

回答

5

在伪代码:

if (close > open) { 
    store_is_open = (open <= now <= close) 
} else { 
    store_is_open = (open <= now || now <= close) 
} 

转换,为SQL:

WHERE IF(
    r.from < r.to, 
    NOW() BETWEEN r.from AND r.to, 
    NOW() >= r.from OR NOW() <= r.to 
) 

您可能还需要检查这是24小时开放的地方。下面的代码假定您将设置fromto时间是相同的(例如:从午夜到午夜)

WHERE IF(
    r.from = r.to, 
    1, 
    IF(
     r.from < r.to, 
     NOW() BETWEEN r.from AND r.to, 
     NOW() >= r.from OR NOW() <= r.to 
    ) 
) 
+0

不错的一个。比我的尝试简单得多。 – enobrev 2010-10-11 17:15:51

0

我从问题中了解,该日期在数据库中保存的datetime型,(您使用NOW()函数)

所以尽量使用:

SELECT * FROM `restaurants` r WHERE r.from <= NOW() 
AND r.to >=DATE_ADD(NOW(),INTERVAL 1 DAY); 

所以它的封面也是这个餐厅,酒吧在次日

+0

我假设他只存储时间,而不是日期。 – nickf 2010-10-11 16:51:03

0

这不是做最有效的方式,但它确实给你要找的...

我猜的结果你tofromTIME列。由于TIME小号比较想不通的日期不同,你要比较它们之前将它们转换为日期:

SELECT *, 
DATE_ADD(CURDATE(), INTERVAL DATE_FORMAT(r.from, '%H:%i') HOUR_MINUTE) AS from_date, 
IF (r.to > r.from, 
    DATE_ADD(CURDATE(), INTERVAL DATE_FORMAT(r.to, '%H:%i') HOUR_MINUTE), 
    DATE_ADD(CURDATE(), INTERVAL DATE_FORMAT(r.to, '+1 %H:%i') DAY_MINUTE) 
) AS to_date 
FROM restaurants r 
HAVING NOW() BETWEEN from_date AND to_date; 

的原因低效是MySQL要经过整个表找出所有from_date和to_dates,然后检查HAVING比较(HAVING允许计算列上的条件)。