2010-04-12 160 views
3

即时通讯尝试显示两个单独的日期列(开始和结束日期)之间预订的项目。我想在日期之间进行搜索,但查询似乎忽略了落在所选日期之间的任何日期。Mysql BETWEEN子句被忽略。没有语法错误

SELECT 
bookings.booking_id, 
bookings.booking_id, 
bookings.booked_from, 
bookings.booked_from, 
bookings.booked_till, 
item_set_computer.item_id, 
item_set_computer.name, 
item_set_computer.booking_groups_id 
FROM 
bookings, 
item_set_computer 
WHERE 
item_set_computer.item_id = bookings.item_id 
AND 
item_set_computer.booking_groups_id = 3 
AND 
booked_from 
BETWEEN "2010-04-13" AND "2010-04-20" 
AND 
booked_till 
BETWEEN "2010-04-13" AND "2010-04-20" 

例如,我有一个项目预订从13日至15日。 date1是2010-04-13,date2是2010-04-15。用户从14日至16日搜索预订商品。它没有返回结果。为什么忽略用户选择日期之间的数据库日期?该列在数据库中设置为DATE,并且已正确输入。

+1

如果您发布到MySQL命令行,您的查询是否有效? – 2010-04-12 16:05:06

回答

0

是否有记录集在这两个表中都属于同一个id?还要确保用WHERE col BETWEEN a AND b,a必须小于b才能工作。

如果您注释掉最后6行,返回什么?

+0

它返回的结果仅限于预订组和预订。是的,存在具有相同item_id的记录集。 – Mark 2010-04-12 16:42:15

4

你说过:“用户从14日到16日搜索预定项目。”

这意味着您的查询就会

AND 
booked_from 
BETWEEN "2010-04-14" AND "2010-04-16" 
AND 
booked_till 
BETWEEN "2010-04-14" AND "2010-04-16" 

第一与条款显然是错误的(因为你的4/13开始日期是不是的确4/14 4/16和之间)

的你正确的逻辑(假设您想要的FULL预订间隔)

AND booked_from >= "2010-04-14" 
AND booked_till <= "2010-04-16" 

或者,如果你想要的部分区间

AND booked_from >= "2010-04-16" -- means we booked before the end of interval 
AND booked_till <= "2010-04-14" -- means we left after the start 
+0

+1击败我! – 2010-04-12 16:11:08

+0

+1。重叠的预订间隔时间将会是'reservations_from <='2010-04-16'AND booked_till> ='2010-04-14'' – Quassnoi 2010-04-12 16:12:52

+0

@Quassnoi - lol好点,当您发表评论时,我正在打字:) – DVK 2010-04-12 16:15:57