1

我正在尝试使用 DATE_SUB() 在 (date-7days) 和 (date-1day) 之间的日期范围之间进行搜索查询(使用 pdo php 和 mysql),例如:

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

然而,下面的查询使用第一个 date_sub(7 天间隔)但忽略了第二个(date_sub(1 天间隔),因此它在 2013-03-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)
";

有人可以帮忙吗?我一直在尝试解决这个问题一个星期,但没有运气

4

1 回答 1

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字段被索引,这将允许使用索引。

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

于 2013-03-27T00:40:48.183 回答