繁体   English   中英

需要更新mysql查询,以选择预订酒店房间或任何东西的日期范围

[英]need updation for mysql query for choosing date range for reservation of a hotel room or any thing

我的项目情况如下。

在检查可用房间时

$sel_from_bookings="SELECT room_no FROM `booking` WHERE (('".$_POST['req_tdate']."' BETWEEN check_indate AND check_outdate) OR ('".$_POST['req_fdate']."' BETWEEN check_indate AND check_outdate)";

$sel_from_reserv="SELECT room_no FROM `reservation` WHERE (('".$_POST['req_tdate']."' BETWEEN check_indate AND check_outdate) OR ('".$_POST['req_fdate']."' BETWEEN check_indate AND check_outdate))"; 

$sel_rooms="SELECT room_no FROM rooms WHERE room_no NOT IN (".$sel_from_bookings.") AND room_no NOT IN (".$sel_from_reserv.")";

第一个查询从预订表中检索满足日期范围的房间号列表

类似地,第二个与表预约相同

最后一个查询使用上述两个查询提供的列表,并获取不在生成列表中的房间列表。

适用于10-08-2010 / 15-08-2010

适用于20-08-2010 / 25-08-2010

当我给出10到15之间的日期时,它同样适用于20和25,并且在14-08-2010和21-08-2010的日期也可以正常工作

但不适用于16-08-2010至19-08-2010

需要任何澄清请问我。

谢谢。

SELECT  *
FROM    room
WHERE   room_no NOT IN
        (
        SELECT  room_no
        FROM    booking
        WHERE   check_outdate >= @req_fdate
                AND check_indate <= @red_tdate
        )
        AND room_no NOT IN
        (
        SELECT  room_no
        FROM    reservation
        WHERE   check_outdate >= @req_fdate
                AND check_indate <= @red_tdate
        )

注意顺序或参数: @req_fdate这里是第一个日期( ), @req_tdate是最后一个日期( 直到 )。

要查看Aug 16Aug 19空房情况,请使用:

SELECT  *
FROM    room
WHERE   room_no NOT IN
        (
        SELECT  room_no
        FROM    booking
        WHERE   check_outdate >= '2010-08-16'
                AND check_indate <= '2010-08-19'
        )
        AND room_no NOT IN
        (
        SELECT  room_no
        FROM    reservation
        WHERE   check_outdate >= '2010-08-16'
                AND check_indate <= '2010-08-19'
        )

check_indate和check_outdate字段有哪些数据类型?

我的猜测是BETWEEN关键字没有按预期工作。 如果用a >= b and a <= c替换a BETWEEN b and c ,事情会有所不同吗?

$sel_from_bookings="SELECT room_no FROM `booking` WHERE (('".$_POST['req_tdate']."' >= check_indate AND '".$_POST['req_tdate']."' <= check_outdate) OR ('".$_POST['req_fdate']."' >= check_indate AND '".$_POST['req_fdate']."' <= check_outdate)";

$sel_from_reserv="SELECT room_no FROM `reservation` WHERE (('".$_POST['req_tdate']."' >= check_indate AND '".$_POST['req_tdate']."' <= check_outdate) OR ('".$_POST['req_fdate']."' >= check_indate AND '".$_POST['req_fdate']."' <= check_outdate))"; 

$sel_rooms="SELECT room_no FROM rooms WHERE room_no NOT IN (".$sel_from_bookings.") AND room_no NOT IN (".$sel_from_reserv.")";

ps:您也可以通过将示例转换为日期列的数据类型来尝试调试。 如果我们假设你的check_indate列的类型是datetime,那么如果你试试这个,请看看mysql给出了什么:

SELECT CAST('16-08-2010' as datetime);

VS

SELECT CAST('20-08-2010' as datetime);

我的mysql在这两个例子都失败了,因为它期望yyyy-mm-dd作为日期格式,但它可能会给你一个提示:)

我将查看您用于check_outdate和check_indate的数据字段的类型。

如果您使用'DATE',请确保输入的格式为YYYY-MM-DD。 如果你输入任何没有分隔符的东西,那么MySQL会猜测日期。 您可以使用PHP函数将日期格式从DD-MM-YYYY(或其他)转换为MySQL预期的正确日期:

$date ='12-12-2007';
$dateTime = new DateTime($date);
$formatted_date=date_format ( $dateTime, 'Y-m-d' );
echo $formatted_date;
// This will output 2007-12-12

如果您使用VARCHAR或固定长度CHAR,则字符串比较可能不是预期的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM