MySQL之间的天数

时间:2010-10-11 16:17:05

标签: sql mysql

我有一个存储餐馆开放时间的应用程序:

我的代码,以获取当前开放的餐厅。我的SQL查询(简化)看起来像

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

这里的问题是,有一个条目可以翻转 - 这是一个餐厅,从第二天上午11点到凌晨3点开放。

捕获该特定餐厅的好查询是什么?

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小时开放的地方。以下代码假定您将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
    )
)

答案 1 :(得分:0)

我从问题中理解,日期是在日期时间类型的DB中保存,(你使用NOW()函数)

所以尽量使用:

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

所以它的封面也是第二天关闭的餐厅

答案 2 :(得分:0)

这不是最有效的方法,但它确实可以提供您正在寻找的结果......

我猜你的tofrom列是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允许计算列的条件)。