我有一个应用程序存储餐厅开放时间:MySQL之间的时间间隔
我的代码来获取当前打开的餐厅。我的SQL查询(简体)看起来像
SELECT *
FROM `restaurants` r
WHERE r.from <= NOW()
AND r.to >= NOW();
这里的问题是,还有其翻转的条目 - 这是从上午11点开一家饭馆凌晨3点的第二天。
什么是一个很好的查询来捕捉特定的餐厅?
我有一个应用程序存储餐厅开放时间:MySQL之间的时间间隔
我的代码来获取当前打开的餐厅。我的SQL查询(简体)看起来像
SELECT *
FROM `restaurants` r
WHERE r.from <= NOW()
AND r.to >= NOW();
这里的问题是,还有其翻转的条目 - 这是从上午11点开一家饭馆凌晨3点的第二天。
什么是一个很好的查询来捕捉特定的餐厅?
在伪代码:
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小时开放的地方。下面的代码假定您将设置from
和to
时间是相同的(例如:从午夜到午夜)
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
)
)
我从问题中了解,该日期在数据库中保存的datetime型,(您使用NOW()函数)
所以尽量使用:
SELECT * FROM `restaurants` r WHERE r.from <= NOW()
AND r.to >=DATE_ADD(NOW(),INTERVAL 1 DAY);
所以它的封面也是这个餐厅,酒吧在次日
我假设他只存储时间,而不是日期。 – nickf 2010-10-11 16:51:03
这不是做最有效的方式,但它确实给你要找的...
我猜的结果你to
和from
是TIME
列。由于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
允许计算列上的条件)。
不错的一个。比我的尝试简单得多。 – enobrev 2010-10-11 17:15:51