2013-03-26 72 views
0

我试图做一个搜索查询(使用pdo php和mysql)之间的日期范围之间(日期7天)和(日期1天)使用DATE_SUB()在两个所以例如:MySQL - DATE_SUB()和DATE_SUB()之间的搜索查询错误

end_date is 2013-03-26 
search between 2013-03-19 and 2013-03-25 ` 

的下面查询然而使用第一DATE_SUB(7天的间隔),但忽略了第二(DATE_SUB(1天间隔),所以它2013年3月19日之间的搜索和2013-03-26。

$sevd_query = " 
    SELECT 
     booking_id, 
     DATE_FORMAT(start_date, '%e/%c') AS s_d, 
     DATE_FORMAT(end_date, '%e/%c') AS e_d 
    FROM 
     bsi_bookings as bb 
    INNER JOIN 
     bsi_reservation as br ON bb.booking_id=br.bookings_id 
    WHERE 
     bc.c_id=:c_id AND 
     :day BETWEEN DATE_SUB(bb.end_date, INTERVAL 7 DAY) AND DATE_SUB(bb.end_date, INTERVAL 1 DAY) 
"; 

任何人都可以请帮忙吗?我一直试图解决这个问题一个星期,现在没有运气

+0

错误信息是什么? – 2013-03-26 23:44:47

+0

没有错误消息 - 它只是查询的输出不匹配从输出我然后显示在我的日历天的具体状态 - 但我可以看到输出搜索到26而不是25 - 是否有任何问题2 date_sub()之间的搜索? – 2013-03-26 23:48:14

+0

@odd_duck是否真的选择了1天前的bb.end_date? – 2013-03-26 23:57:08

回答

0

子句:

:day BETWEEN DATE_SUB(bb.end_date, INTERVAL 7 DAY) AND 
      DATE_SUB(bb.end_date, INTERVAL 1 DAY) 

可以表示为:

day >= (end_date - 7) AND 
day <= (end_date - 1) 

其可以被重写为:

(day + 7) >= end_date AND 
(day + 1) <= end_date 

这是一样的:

end_date <= (day + 7) AND 
end_date >= (day + 1) 

这也是:

end_date >= (day + 1) AND 
end_date <= (day + 7) 

这也可以写成:

end_date BETWEEN (day + 1) AND (day + 7) 

,我不认为这是你想要的。

试试这个:

SELECT 
    booking_id, 
    DATE_FORMAT(start_date, '%e/%c') AS s_d, 
    DATE_FORMAT(end_date, '%e/%c') AS e_d 
FROM 
    bsi_bookings as bb 
INNER JOIN 
    bsi_reservation as br ON bb.booking_id=br.bookings_id 
WHERE 
    bc.c_id=:c_id AND 
    bb.end_date BETWEEN :day - INTERVAL 7 DAY AND :day - INTERVAL 1 DAY; 

如果end_date字段建立索引,这将允许使用索引。

如果要搜索的字段包含在函数中,则不会使用索引。

+0

这仍然不适合我罗斯 - 是只是我或上述日间休息日 - 不是结束日期,这是我需要的(不要听起来粗鲁!) – 2013-03-27 00:57:52

+0

我很困惑你的问题。如果用'2013-03-26'代替':day'参数,那么你想要找到'end_date'介于'2013-03-19'和'2013-03-25'之间的所有记录,对吗?如果是这样,上面的查询应该适合你,如果没有,那么问题在于你的代码中的其他地方。 – 2013-03-27 01:07:08