2010-08-03 9 views
5

tuve una situación en mi proyecto que es la siguiente.necesito la actualización para la consulta de MySQL para elegir el intervalo de fechas para la reserva de una habitación de hotel o cualquier cosa

durante el chequeo de las habitaciones disponibles

$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.")"; 

La primera consulta retrives la lista de los números de habitación de la mesa de reserva que satisface la daterange

de manera similar el segundo uno dos mismos desde la reserva de mesa

la última consulta utiliza la lista proporcionada por las dos consultas anteriores y obtiene la lista de salas que no están en la lista generada.

funciona bien para 10-08-2010/15-08-2010

funciona bien para 20-08-2010/25-08-2010

cuando doy las fechas entre 10 y 15 se funciona bien de manera similar para 20 y 25 y también funciona bien para las fechas 14-08-2010 y 21-08-2010

pero no trabajan para 16-08-2010 a 19-08-2010

necesita ningún aclaración por favor pregúntame.

Gracias.

+3

No use $ _POST en una consulta sin desinfectarla antes, hace que su sitio sea vulnerable a las inyecciones de SQL (puede perder todos sus datos). – greg0ire

+0

@ greg0ire gracias lo tendré en cuenta. ¿Recibiste mi pregunta? o necesita alguna aclaración? Gracias. – srinivas

+0

¿Qué significa "no funciona"? ¿Recibes algún mensaje de error? ¿Estás manejando errores de MySQL? – greg0ire

Respuesta

1
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 
     ) 

atención a la orden o los argumentos: @req_fdate aquí es la primera fecha aquí (de), @req_tdate es la última fecha (hasta).

Para comprobar disponibilidad Aug 16-Aug 19, utilice esto:

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' 
     ) 
0

¿qué tipo de datos tienen los campos check_indate y check_outdate?

Supongo que la palabra clave BETWEEN no funciona como se esperaba. ¿Las cosas funcionan de manera diferente si reemplaza a BETWEEN b and c con a >= b and a <= 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: también puede intentar depurar lanzando sus ejemplos al tipo de datos de sus columnas de fecha. si suponemos que su columna check_indate es de tipo fecha y hora, el ver lo MySQL le devuelve si se intenta esto:

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

vs

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

Mi MySQL aquí falla en ambos ejemplos, ya que espera aaaa-mm -dd como formato de fecha, pero podría dar una pista :) atención

0

me gustaría ver el tipo de campo de datos que está utilizando para la check_outdate y check_indate.

Si está utilizando 'FECHA', asegúrese de que la entrada tenga el formato AAAA-MM-DD. Si ingresa algo más sin separadores, MySQL adivinará la fecha.Puede utilizar la función de PHP para convertir un formato de fecha de DD-MM-AAAA (o lo que sea) a la fecha correcta esperada por 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 

Si está utilizando un VARCHAR o CHAR longitud fija, entonces las comparaciones de cadenas puede no ser como se esperaba

Cuestiones relacionadas