我有一个存储餐馆开放时间的应用程序:
我的代码,以获取当前开放的餐厅。我的SQL查询(简化)看起来像
SELECT *
FROM `restaurants` r
WHERE r.from <= NOW()
AND r.to >= NOW();
这里的问题是,有一个条目可以翻转 - 这是一个餐厅,从第二天上午11点到凌晨3点开放。
捕获该特定餐厅的好查询是什么?
答案 0 :(得分: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小时开放的地方。以下代码假定您将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
)
)
答案 1 :(得分:0)
我从问题中理解,日期是在日期时间类型的DB中保存,(你使用NOW()函数)
所以尽量使用:
SELECT * FROM `restaurants` r WHERE r.from <= NOW()
AND r.to >=DATE_ADD(NOW(),INTERVAL 1 DAY);
所以它的封面也是第二天关闭的餐厅
答案 2 :(得分:0)
这不是最有效的方法,但它确实可以提供您正在寻找的结果......
我猜你的to
和from
列是TIME
列。由于TIME
s的比较无法确定日期差异,因此您需要在比较之前将其更改为日期:
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
允许计算列的条件)。