Autor Tema: intervalos de fechas MySql con Java para comprobar reservas en hotel  (Leído 32027 veces)

gatoher

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 86
    • Ver Perfil
Hola a todos, estoy realizando un ejercicio de reservas y  tengo dos problemas con las fechas. Me explico, es un ejercicio para reservas de un hotel, y cuando alguien quiere reservar una habitación por ejemplo "del 1 de agosto al 15", yo quiero recorrer todas la tabla donde almaceno todas las reservas y saber que habitaciones tengo libre.
No se me ocurre que select podría hacer.

La otra duda es que utilizo en java para apuntar las fechas dos JDate, y cada habitación tiene un costo por día. Si alguien quiere estar del 28 de agosto al 14 de septiembre no se como hacer para restar y me devuelva el número de días.

Estoy trabajando con MySql y Java.  La verdad que estoy atascado ahora mismo por que no veo como hacerlo.
« Última modificación: 13 de Septiembre 2014, 18:44 por Alex Rodríguez »

gatoher

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 86
    • Ver Perfil
Re:Problema con fechas en un ejercicio
« Respuesta #1 en: 23 de Agosto 2014, 18:27 »
Dandole vueltas he pensado que podría ser algo a:
El usuario introduce una fecha_inicio y fecha_salida de la reserva. La select debería ser:

select idhabitacion from reservas where "fecha_inicio_nueva_reserva" y "fecha_salida_nueva_reserva" < menor fecha_inicio de todas las reservas OR  "fecha_inicio_nueva_reseva" > fecha_salida de todas las reservas

Pero no consigo construirla  >:(

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re:Problema con fechas en un ejercicio
« Respuesta #2 en: 23 de Agosto 2014, 19:35 »
Tienes que partir de tablas de la base de datos bien organizadas, si no lo haces así va a ser muy difícil que logres crear programas que funcionen.

La estructura habitual suele ser:

Tabla habitaciones: idHabitación, numeroDeCamas, tipoHabitacion, numeroHabitacion, etc.

Tabla reservas: idReserva, idHabitacion, fechaEntrada, fechaSalida

Cuando alguien quiere hacer una reserva para una habitación tienes que buscar en la tabla reservas todas las reservas cuyo idHabitacion coincida con la habitación de la que se va a hacer la reserva,  y cuya fechaEntrada sea mayor o igual que la fechaEntrada en la que se quiere hacer la reserva. A partir de ahí tienes que comprobar si existe solape de fechas, si existe solape la reserva no es posible. Si no existe solape, sí es posible...

gatoher

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 86
    • Ver Perfil
Re:Problema con fechas en un ejercicio
« Respuesta #3 en: 24 de Agosto 2014, 20:07 »
Hola Ogramar, lo he intentado asi;

"Select ha.idhabitacion, numero, piso, descripcion, caracteristicas, precio_diario, ha.estado, tipo_habitacion
from habitacion ha , reserva re where ha.idhabitacion=re.idhabitacion and  '2014-02-15' < re.fecha_ingreso
and  '2014-02-01' > re.fecha_salida and ha.estado='disponible' "

Disponible es un campo en la tabla habitación que tiene disponible, en obras, etc. Asi funciona solo si hay reservas, a ver si me explico. Al buscar en la tabla reservas, solo filtra las habitaciones que tienen reservas. En este caso hay una reserva en Febrero, pero no me aparece ninguna habitación, todas estan libres y claro no estan en la tabla reserva. Es lógico.

Si tienes  5 habitaciones y en un mes x tienes en la tabla reservas 2 reservas con dos habitaciones distintas, es una tonteria buscar ahi las habitaciones que estan libres por que ahi no aparecen.

 

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re:Problema con fechas en un ejercicio
« Respuesta #4 en: 24 de Agosto 2014, 20:30 »
¿Y te ha funcionado bien?

gatoher

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 86
    • Ver Perfil
Re:Problema con fechas en un ejercicio
« Respuesta #5 en: 24 de Agosto 2014, 21:05 »
No Ogramar, conforme esta la select no.

Select ha.idhabitacion, numero, piso, descripcion, caracteristicas, precio_diario, ha.estado, tipo_habitacion
from habitacion ha , reserva re where ha.idhabitacion=re.idhabitacion and  '2014-02-15' < re.fecha_ingreso
and '2014-02-01' > re.fecha_salida and ha.estado='disponible'   

Haber, es lógico como he explicado,con una select no se puede hacer. A ver, las fechas que estan en números son las fechas que al abrir el JFram tu escribes para saber si en esas fechas hay alguna habitación libre, y fecha_ingreso y fecha_salida son las fechas que tienen todas las reservas en la tabla reservas.
Claro, en la tabla reserva no va a aparecer una habitación si no ha sido reservada.

Pongo una immagen de bbdd

gatoher

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 86
    • Ver Perfil
Re:Problema con fechas en un ejercicio
« Respuesta #6 en: 24 de Agosto 2014, 21:11 »
Vaya sin querer le di a mandar, no estoy acertado hoy. A ver esta select hace justo lo contrario que yo quiero, osea me devuelve todas las habitaciones de la tabla reservas que esten ocupadas en un rango de fechas x.

Ahora faltaría poder sacar de la tabla habitaciones las que no estan ahi. Por ejemplo tengo cinco habitaciones y esta select me devuelve dos idhabitaciones:

Select ha.idhabitacion, numero, piso, descripcion, caracteristicas, precio_diario, ha.estado, tipo_habitacion
from habitacion ha , reserva re where ha.idhabitacion=re.idhabitacion and  '2014-08-02' >= re.fecha_ingreso
and '2014-08-14' <= re.fecha_salida and ha.estado='disponible'

Solonhe cambiado los signos para que me devuelva de la tabla reservas las habitaciones que en la fecha de ingreso y salida se encuentre entre el rango que le doy.

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re:Problema con fechas en un ejercicio
« Respuesta #7 en: 24 de Agosto 2014, 22:23 »
No sé si estaré acertado o no, pero empezaría planteando todo el proceso desde un punto de vista de lógica a aplicar para luego pasar a crear el código:

Las posibilidades de que dada una fechaSolicitaDeEntrada y fechaSalidaSolicitada exista coincidencia con una reserva serían:


Ejemplo 1: Estamos dentro del intervalo de la reserva. Solicito del 10 al 15 de octubre. Hay reserva del 10 al 12 de octubre ó hay reserva del 10 al 15 de octubre

fechaSolicitadaDeEntrada >= fechaIngresoEnLaReserva y fechaSolicitadaDeSalida<= fechaSalidaEnLaReserva


Ejemplo 2: La reserva empezó antes pero se solapa con las fechas solicitadas. solicito del 10 al 15 de octubre. Hay reserva del 7 al 12 de octubre.

fechaSolicitadaDeEntrada < fechaIngresoEnLaReserva y fechaSolicitadaDeSalida<= fechaSalidaEnLaReserva


Ejemplo 3: La solicitud empieza en un día de reserva y termina fuera de la reserva. solicito del 10 al 15 de octubre. Hay reserva del 13 al 18 de octubre.

fechaSolicitadaDeEntrada > fechaIngresoEnLaReserva y fechaSolicitadaDeEntrada < fechaSalidaEnLaReserva


En estos tres casos la habitación no está disponible para reserva, en otro caso sí está disponible.


También lo podemos plantear al revés:

Si fechaSolicitadaEntrada<fechaIngresoEnLaReserva y fechaSolicitadaSalida < fechaIngresoEnLaReserva -- > la habitación está libre (se intenta tomar antes de la reserva)

Si fechaSolicitadaEntrada > fechaSalidaEnLaReserva -- > la habitación está libre (se intenta tomar después)



Ahora esbozando lo que sería el proceso en código:

Código: [Seleccionar]

$arrayDeIdHabitaciones -- > Almacenamos aquí cada id de habitación

Ahora hacemos un bucle:

Para cada idHabitación "idHabitac" en $arrayDeHabitaciones

{
arraySeleccion = Seleccionar las filas de la tabla reservas donde (idHabitac sea igual a idHabitacion de esa fila)

Para cada fila en arraySeleccion {
(Si fechaSolicitadaEntrada<fechaIngresoEnLaReserva y fechaSolicitadaSalida < fechaIngresoEnLaReserva) ó
(fechaSolicitadaEntrada > fechaSalidaEnLaReserva) ENTONCES {estadoHabitacion[idHabitacion] = 'DISPONIBLE'; disponible[i]=idHabitacion)
ELSE
{estadoHabitacion[idHabitacion] = 'OCUPADA'}

}

}


Finalmente, mostramos las habitaciones disponibles (todas las que existan en array disponible)

El proceso lo veo un poco laborioso pero al menos creo que con esto se llegaría al resultado deseado. Quizás haya que hacer algunos ajustes y pruebas  ::)

gatoher

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 86
    • Ver Perfil
Re:intervalos de fechas MySql para reservas en hotel
« Respuesta #8 en: 25 de Agosto 2014, 00:02 »
Ogramar creo que lo he conseguido, pero un cacho código que no veas. Lo pongo a ver que tal lo ves, lo he probado un par de veces y parece funcionar.

Código: [Seleccionar]
public DefaultTableModel mostrarHabitacionesLibres(String fechaInicio, String fechaSalida) {
       
        String sql=""; //Select donde sacaremos las habitaciones que estan en la tablaReservas
        String sqlContarHab = "Select count(*) from reserva re, habitacion ha " +"\n" +
" where ha.idhabitacion=re.idhabitacion and  '"+fechaInicio+"'  >= re.fecha_ingreso \n" +
"and '"+fechaInicio+"' <= re.fecha_salida and ha.estado='Disponible' ";  // tamaño que va a tener el array de habitaciones libres
        int [] habitacionesLibres = null;   // Declaramos el array donde almacenaremos los id de las habitaciones ocupadas
        int cantidadHabitaciones = 0; // Variable para almacenar el tamaño del array
        DefaultTableModel modelob; //TableModel donde mostraremos las habitaciones libres
       
  //Si la fecha del posible nuevo ingreso es mayor a la fecha de inicio de cualquier reserva
  // y al mismo tiempo la fecha de inicio es menor que la fecha de salida de cualquier reserva
  // significa que esta en el rango interior de una reserva ya realizado
        //de momento esto vale habra q estudiarlo más profundamente
sql ="Select ha.idhabitacion from reserva re, habitacion ha " +"\n" +
" where ha.idhabitacion=re.idhabitacion and  '"+fechaInicio+"'  >= re.fecha_ingreso \n" +
"and '"+fechaInicio+"' <= re.fecha_salida and ha.estado='Disponible' ";       
                       
        String[] titulos = {"ID",  "Numero", "Piso", "Descripcion", "Caracteristicas", "Precio Diario", "Estado", "Tipo de Habitacion"};
        String[] registro = new String [8];
        modelob = new DefaultTableModel(null, titulos);
       
        try{
           
         int i = 0;   
        conn.conecta();
        conn.crearSentencia();
        conn.ejecutaSQL(sqlContarHab); //Sentencia para saber el tamaño
        while (conn.getRs().next()){
            cantidadHabitaciones = conn.getRs().getInt(1); //Almacenamos tamaño
           
        }
        habitacionesLibres = new int[cantidadHabitaciones]; //Instanciamos el array con el nuevo tamaño
        conn.ejecutaSQL(sql); //Sql que nos devuelve el id de las habitaciones ocupadas
       
          while (conn.getRs().next()) {
              habitacionesLibres[i]= conn.getRs().getInt(1); //Almacenamos en el array el id de las habitaciones ocupadas
              i++;
          }
         
          String sqlHabitacionesLibres=""; //Sentencia  para mostrar las habitaciones libres
       
          //For donde vamos cambiando el id de la habitacion en la select
            for (int h = 0; h < habitacionesLibres.length; h++) {
             
            sqlHabitacionesLibres = "Select distinct idhabitacion,numero,piso,descripcion, caracteristicas," +"\n" +
                    " precio_diario,estado, tipo_habitacion  from habitacion where idhabitacion= "+habitacionesLibres[h]+" and idhabitacion != '"+0+"'";
                System.out.println("El sqlHabitacionesLibres vale=> " + sqlHabitacionesLibres);
         //Ejecutamos el result tantas veces como el tamaño del array de habitaciones libres
         //Esto se podría hacer de otra manera es lo primero que se me ha ocurrido
         //Y lo que he tratado de evitar desde un principio
          conn.ejecutaSQL(sqlHabitacionesLibres);
          while(conn.getRs().next()){
                registro[0] = conn.getRs().getString("idhabitacion");
                registro[1] = conn.getRs().getString("numero");
                registro[2] = conn.getRs().getString("piso");
                registro[3] = conn.getRs().getString("descripcion");
                registro[4] = conn.getRs().getString("caracteristicas");
                registro[5] = conn.getRs().getString("precio_diario");
                registro[6] = conn.getRs().getString("estado");
                registro[7] = conn.getRs().getString("tipo_habitacion");
          }

             totalRegistro = totalRegistro + 1;
                System.out.println("el total registros es " +totalRegistro);
                modelob.addRow(registro);

            }     
            conn.cerrarConexion();

        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "No se ha podido recuperar los datos desde mostrarHabitacionesLibres." + e);
        }
       
         for(int z = 0; z < habitacionesLibres.length; z++){
              System.out.println("El valor de habitacionesLibres en " + z +" es" + habitacionesLibres[z]);
         }
       
       
        return modelob;
    }   

gatoher

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 86
    • Ver Perfil
Re:intervalos de fechas MySql para reservas en hotel
« Respuesta #9 en: 25 de Agosto 2014, 00:58 »
No no funciona bien, el último bucle for que utilizo para cambiar el idhabitacion machaca el resulset, solo devuelve el último resultado  :'(

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re:intervalos de fechas MySql para reservas en hotel
« Respuesta #10 en: 25 de Agosto 2014, 10:56 »
No entiendo bien el comentario que pones al final de esta sentencia:

String sqlContarHab = "Select count(*) from reserva re, habitacion ha " +"\n" +
" where ha.idhabitacion=re.idhabitacion and  '"+fechaInicio+"'  >= re.fecha_ingreso \n" +
"and '"+fechaInicio+"' <= re.fecha_salida and ha.estado='Disponible' ";  // tamaño que va a tener el array de habitaciones libres

Aquí lo que estás diciendo es que te diga el número de habitaciones que están en la tabla de habitaciones y en la tabla de reservas simultáneamente y la fechaSolicitadaDeInicio sea mayor o igual a la fecha de ingreso de la reserva y que la fechaSolicitadaDeInicio sea menor o igual a la fecha de salida de la reserva. Esto te selecciona las habitaciones que donde la solicitud está dentro de las fechas de una reserva.

En el comentario indicas <<tamaño que va a tener el array de habitaciones libres>> pero aquí en realidad lo que estás obteniendo son habitaciones que están ocupadas, y ni siquiera todas las que están ocupadas ¿? (no acabo de entender).


Supongamos una reserva1 que va del 10 al 15 de octubre y una reserva2 que va del 16 al 20 de octubre y se solicita del 8 al 17 de octubre.

Para la reserva1 la fechaIngreso no es menor que fechaInicio, por lo que no cuenta. Para la reserva2 la fechaInicio no es mayor que la fechaIngreso, por lo que no cuenta. 

No sé si me equivoco pero si planteas tres select:

1) fechaSolicitadaDeEntrada >= fechaIngresoEnLaReserva y fechaSolicitadaDeSalida<= fechaSalidaEnLaReserva

2) fechaSolicitadaDeEntrada < fechaIngresoEnLaReserva y fechaSolicitadaDeSalida<= fechaSalidaEnLaReserva

3) fechaSolicitadaDeEntrada > fechaIngresoEnLaReserva y fechaSolicitadaDeEntrada < fechaSalidaEnLaReserva

Ahí podrías almacenar las habitaciones que están ocupadas.

Luego unes esos resultados en un set para eliminar duplicados y tienes todas las habitaciones ocupadas.

Luego mostrarías todas las habitaciones disponibles menos las ocupadas..., que son las habitaciones libres disponibles para poder hacer la reserva en esa fecha  ::)

gatoher

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 86
    • Ver Perfil
Re:intervalos de fechas MySql para reservas en hotel
« Respuesta #11 en: 25 de Agosto 2014, 16:06 »
Hola Ogramar, ahora más que la propia select lo que no se como hacer es cuando tengo el id de las habitaciones ocupadas en x fechas, supongamos "idhabitacion 1,6,10,20". ¿Como hago para sacar el resto?.

Esos id son dinamicos, no puedo ir a la tabla habitaciones y decir select xxxx where idhabitacion no sea 1,6,10,20.
Lo he intentado con un bucle for, pero me machaca en cada iteracion el dataTable.

Estoy algo fustrado, he intentado crear objetos de habitacion dentro del bucle for y meterlos en un array para que no se machacasen, pero se me va de las manos  :-\

gatoher

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 86
    • Ver Perfil
Re:intervalos de fechas MySql para reservas en hotel
« Respuesta #12 en: 25 de Agosto 2014, 16:47 »
Voy a poner como lo tengo ahora y la salida que me hace;

Código: [Seleccionar]
public DefaultTableModel mostrarHabitacionesLibres(String fechaInicio, String fechaSalida) {
       
        String sql=""; //Select donde sacaremos las habitaciones que estan en la tablaReservas
        // tamaño que va a tener el array de habitaciones libres
        //Suponiendo que estan todas libres
        String sqlContarHab = "Select  count(*) from habitacion"; 
        System.out.println("El sql contar habitaciones vale => " + sqlContarHab);
        int [] habitacionesOcupadas = null;   // Declaramos el array donde almacenaremos los id de las habitaciones ocupadas
        int cantidadHabitaciones = 0; // Variable para almacenar el tamaño del array
        DefaultTableModel modelob; //TableModel donde mostraremos las habitaciones libres
       Habitacion[] miArray = new Habitacion[10];
  //Si la fecha del posible nuevo ingreso es mayor a la fecha de inicio de cualquier reserva
  // y al mismo tiempo la fecha de inicio es menor que la fecha de salida de cualquier reserva
  // significa que esta en el rango interior de una reserva ya realizado
        //de momento esto vale habra q estudiarlo más profundamente
        sql ="Select ha.idhabitacion from reserva re, habitacion ha " +"\n" +
        " where ha.idhabitacion=re.idhabitacion and  '"+fechaInicio+"'  >= re.fecha_ingreso \n" +
        "and '"+fechaInicio+"' <= re.fecha_salida and ha.estado='Disponible' ";       
        System.out.println("El sql para saber que habitaciones estan ocupadas es => " + sql);
       
       
        String[] titulos = {"ID",  "Numero", "Piso", "Descripcion", "Caracteristicas", "Precio Diario", "Estado", "Tipo de Habitacion"};
        String[] registro = new String [8];
        modelob = new DefaultTableModel(null, titulos);
       
        try{
           
       
        conn.conecta();
        conn.crearSentencia();
        conn.ejecutaSQL(sqlContarHab); //Sentencia para saber el tamaño, total de habitaciones que tenemos
        while (conn.getRs().next()){
            cantidadHabitaciones = conn.getRs().getInt(1); //Almacenamos tamaño
        }
        conn.cerrarConexion();
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "No se ha podido recuperar los datos desde mostrarHabitacionesLibres." + e);
        }
       
        try{
           
            int i = 0;     
        System.out.println("La cantidad de habitaciones que estan ocupadas son => " +cantidadHabitaciones);
        habitacionesOcupadas= new int[cantidadHabitaciones]; //Instanciamos el array con el nuevo tamaño
        conn.conecta();
        conn.crearSentencia();
        conn.ejecutaSQL(sql); //Sql que nos devuelve el id de las habitaciones ocupadas
       
          while (conn.getRs().next()) {
              habitacionesOcupadas[i]= conn.getRs().getInt(1); //Almacenamos en el array el id de las habitaciones ocupadas
              i++;
              System.out.println("El numero de id de las habitaciones ocupadas es => " + habitacionesOcupadas[i]);
          }
        conn.cerrarConexion();
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "No se ha podido recuperar los datos desde mostrarHabitacionesLibres." + e);
        }
       
           try{         
          String sqlHabitacionesLibres=""; //Sentencia  para mostrar las habitaciones libres
           
          //For donde vamos cambiando el id de las habitaciones ue estaban ocupadas
            for (int h = 0; h < habitacionesOcupadas.length; h++) {
            System.out.println("La longitud de habitacionesLibres es => " + habitacionesOcupadas.length); 
            sqlHabitacionesLibres = "Select distinct idhabitacion,numero,piso,descripcion, caracteristicas," +"\n" +
                    " precio_diario,estado, tipo_habitacion  from habitacion where idhabitacion != "+habitacionesOcupadas[h]+" ";
            System.out.println("El sqlHabitacionesLibres vale=> " + sqlHabitacionesLibres);
           
            //Variable para crear un objeto
            Habitacion obj=null;
            int idhabitacion;
            String numero;
            String piso;
            String descripcion;
            String caracteristicas;
            Double precio;
            String estado;
            String tipo_habitacion;         
       
       
        conn.conecta();
        conn.crearSentencia();
        conn.ejecutaSQL(sqlHabitacionesLibres);
       
          while(conn.getRs().next()){
            idhabitacion = conn.getRs().getInt(1);
            numero = conn.getRs().getString("numero");
            piso = conn.getRs().getString("piso");
            descripcion = conn.getRs().getString("descripcion");
            caracteristicas = conn.getRs().getString("caracteristicas");
            precio = Double.parseDouble(conn.getRs().getString("precio_diario"));
            estado = conn.getRs().getString("estado");
            tipo_habitacion = conn.getRs().getString("tipo_habitacion");
           
             
            obj = new Habitacion(idhabitacion, numero, piso, descripcion, caracteristicas, precio, estado, tipo_habitacion);
               //hay que crear un vector de objetos habitacion
             miArray[h]= obj;
            System.out.println("" + obj.toString());   
          }
         
           //Fin del bucle for
            }
           
             for(int i=0; i<miArray.length; i++){
         
            registro[0]= String.valueOf(miArray[i].getIdhabitacion());
            registro[1] = miArray[i].getNumero();
            registro[2] = miArray[i].getPiso();
            registro[3] = miArray[i].getDescripcion();
            registro[4] = miArray[i].getCaracteristicas();
            registro[5] = String.valueOf(miArray[i].getPrecio().toString());
            registro[6] = miArray[i].getEstado();
            registro[7] = miArray[i].getTipo_habitacion();
            totalRegistro = totalRegistro + 1;
           System.out.println("el total registros es " +totalRegistro);
             modelob.addRow(registro);
        }
       
       conn.cerrarConexion();
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "No se ha podido recuperar los datos desde mostrarHabitacionesLibres." + e);
        }
                 
                     return modelob;
   




La salida por consola, ya que no se porque el modelo no me lo coje el table, y se repite varias veces por que al haber un  for para modificar la select ...
Eso pensaba solucionarlo con antes de meter el objeto en el Array de objetos Habitacion hacer un Compare to por ejemplo con el numero de la habitacion.

FechaInicio vale=>2014-08-01
El sql contar habitaciones vale => Select  count(*) from habitacion
El sql para saber que habitaciones estan ocupadas es => Select ha.idhabitacion from reserva re, habitacion ha
 where ha.idhabitacion=re.idhabitacion and  '2014-08-01'  >= re.fecha_ingreso
and '2014-08-01' <= re.fecha_salida and ha.estado='Disponible'
Conectando con la base de datos
Conexión establecida con la Base de datos...

Sentencia creada con éxito.

Conexión cerrada con éxito.
La cantidad de habitaciones que estan ocupadas son => 5
Conectando con la base de datos
Conexión establecida con la Base de datos...

Sentencia creada con éxito.

Conexión cerrada con éxito.
La longitud de habitacionesLibres es => 5
El sqlHabitacionesLibres vale=> Select distinct idhabitacion,numero,piso,descripcion, caracteristicas,
 precio_diario,estado, tipo_habitacion  from habitacion where idhabitacion != 0
Conectando con la base de datos
Conexión establecida con la Base de datos...

Sentencia creada con éxito.
El idhabitacion es; 1
 el numero de la habitacion es; 1
 el piso es; 1
 la descripcion es; fff
 las caracteristicas son; ffff
 el precio es; 100.0
 su estado es; Disponible
 el tipo de habitacion es; ffff
El idhabitacion es; 2
 el numero de la habitacion es; 2
 el piso es; 1
 la descripcion es; con nevera
 las caracteristicas son; interior
 el precio es; 20.0
 su estado es; Disponible
 el tipo de habitacion es; Individual
El idhabitacion es; 3
 el numero de la habitacion es; 3
 el piso es; 1
 la descripcion es; dddd
 las caracteristicas son; ddddd
 el precio es; 200.0
 su estado es; Disponible
 el tipo de habitacion es; ddddd
El idhabitacion es; 4
 el numero de la habitacion es; 4
 el piso es; 1
 la descripcion es; edeee
 las caracteristicas son; eeeee
 el precio es; 300.0
 su estado es; Disponible
 el tipo de habitacion es; eeeee
El idhabitacion es; 5
 el numero de la habitacion es; 10
 el piso es; 3
 la descripcion es; Matrimonio
 las caracteristicas son; exterior
 el precio es; 200.0
 su estado es; Disponible
 el tipo de habitacion es; exterior
La longitud de habitacionesLibres es => 5
El sqlHabitacionesLibres vale=> Select distinct idhabitacion,numero,piso,descripcion, caracteristicas,
 precio_diario,estado, tipo_habitacion  from habitacion where idhabitacion != 0
Conectando con la base de datos
Conexión establecida con la Base de datos...

Sentencia creada con éxito.
El idhabitacion es; 1
 el numero de la habitacion es; 1
 el piso es; 1
 la descripcion es; fff
 las caracteristicas son; ffff
 el precio es; 100.0
 su estado es; Disponible
 el tipo de habitacion es; ffff
El idhabitacion es; 2
 el numero de la habitacion es; 2
 el piso es; 1
 la descripcion es; con nevera
 las caracteristicas son; interior
 el precio es; 20.0
 su estado es; Disponible
 el tipo de habitacion es; Individual
El idhabitacion es; 3
 el numero de la habitacion es; 3
 el piso es; 1
 la descripcion es; dddd
 las caracteristicas son; ddddd
 el precio es; 200.0
 su estado es; Disponible
 el tipo de habitacion es; ddddd
El idhabitacion es; 4
 el numero de la habitacion es; 4
 el piso es; 1
 la descripcion es; edeee
 las caracteristicas son; eeeee
 el precio es; 300.0
 su estado es; Disponible
 el tipo de habitacion es; eeeee
El idhabitacion es; 5
 el numero de la habitacion es; 10
 el piso es; 3
 la descripcion es; Matrimonio
 las caracteristicas son; exterior
 el precio es; 200.0
 su estado es; Disponible
 el tipo de habitacion es; exterior
La longitud de habitacionesLibres es => 5
El sqlHabitacionesLibres vale=> Select distinct idhabitacion,numero,piso,descripcion, caracteristicas,
 precio_diario,estado, tipo_habitacion  from habitacion where idhabitacion != 0
Conectando con la base de datos
Conexión establecida con la Base de datos...

Sentencia creada con éxito.
El idhabitacion es; 1
 el numero de la habitacion es; 1
 el piso es; 1
 la descripcion es; fff
 las caracteristicas son; ffff
 el precio es; 100.0
 su estado es; Disponible
 el tipo de habitacion es; ffff
El idhabitacion es; 2
 el numero de la habitacion es; 2
 el piso es; 1
 la descripcion es; con nevera
 las caracteristicas son; interior
 el precio es; 20.0
 su estado es; Disponible
 el tipo de habitacion es; Individual
El idhabitacion es; 3
 el numero de la habitacion es; 3
 el piso es; 1
 la descripcion es; dddd
 las caracteristicas son; ddddd
 el precio es; 200.0
 su estado es; Disponible
 el tipo de habitacion es; ddddd
El idhabitacion es; 4
 el numero de la habitacion es; 4
 el piso es; 1
 la descripcion es; edeee
 las caracteristicas son; eeeee
 el precio es; 300.0
 su estado es; Disponible
 el tipo de habitacion es; eeeee
El idhabitacion es; 5
 el numero de la habitacion es; 10
 el piso es; 3
 la descripcion es; Matrimonio
 las caracteristicas son; exterior
 el precio es; 200.0
 su estado es; Disponible
 el tipo de habitacion es; exterior
La longitud de habitacionesLibres es => 5
El sqlHabitacionesLibres vale=> Select distinct idhabitacion,numero,piso,descripcion, caracteristicas,
 precio_diario,estado, tipo_habitacion  from habitacion where idhabitacion != 0
Conectando con la base de datos
Conexión establecida con la Base de datos...

Sentencia creada con éxito.
El idhabitacion es; 1
 el numero de la habitacion es; 1
 el piso es; 1
 la descripcion es; fff
 las caracteristicas son; ffff
 el precio es; 100.0
 su estado es; Disponible
 el tipo de habitacion es; ffff
El idhabitacion es; 2
 el numero de la habitacion es; 2
 el piso es; 1
 la descripcion es; con nevera
 las caracteristicas son; interior
 el precio es; 20.0
 su estado es; Disponible
 el tipo de habitacion es; Individual
El idhabitacion es; 3
 el numero de la habitacion es; 3
 el piso es; 1
 la descripcion es; dddd
 las caracteristicas son; ddddd
 el precio es; 200.0
 su estado es; Disponible
 el tipo de habitacion es; ddddd
El idhabitacion es; 4
 el numero de la habitacion es; 4
 el piso es; 1
 la descripcion es; edeee
 las caracteristicas son; eeeee
 el precio es; 300.0
 su estado es; Disponible
 el tipo de habitacion es; eeeee
El idhabitacion es; 5
 el numero de la habitacion es; 10
 el piso es; 3
 la descripcion es; Matrimonio
 las caracteristicas son; exterior
 el precio es; 200.0
 su estado es; Disponible
 el tipo de habitacion es; exterior
La longitud de habitacionesLibres es => 5
El sqlHabitacionesLibres vale=> Select distinct idhabitacion,numero,piso,descripcion, caracteristicas,
 precio_diario,estado, tipo_habitacion  from habitacion where idhabitacion != 0
Conectando con la base de datos
Conexión establecida con la Base de datos...

Sentencia creada con éxito.
El idhabitacion es; 1
 el numero de la habitacion es; 1
 el piso es; 1
 la descripcion es; fff
 las caracteristicas son; ffff
 el precio es; 100.0
 su estado es; Disponible
 el tipo de habitacion es; ffff
El idhabitacion es; 2
 el numero de la habitacion es; 2
 el piso es; 1
 la descripcion es; con nevera
 las caracteristicas son; interior
 el precio es; 20.0
 su estado es; Disponible
 el tipo de habitacion es; Individual
El idhabitacion es; 3
 el numero de la habitacion es; 3
 el piso es; 1
 la descripcion es; dddd
 las caracteristicas son; ddddd
 el precio es; 200.0
 su estado es; Disponible
 el tipo de habitacion es; ddddd
El idhabitacion es; 4
 el numero de la habitacion es; 4
 el piso es; 1
 la descripcion es; edeee
 las caracteristicas son; eeeee
 el precio es; 300.0
 su estado es; Disponible
 el tipo de habitacion es; eeeee
El idhabitacion es; 5
 el numero de la habitacion es; 10
 el piso es; 3
 la descripcion es; Matrimonio
 las caracteristicas son; exterior
 el precio es; 200.0
 su estado es; Disponible
 el tipo de habitacion es; exterior
el total registros es 1
el total registros es 2
el total registros es 3
el total registros es 4
el total registros es 5

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re:intervalos de fechas MySql para reservas en hotel
« Respuesta #13 en: 25 de Agosto 2014, 17:44 »
Supongamos que hacemos un select

select idHabitacion from habitacion where estado='Disponible'

El resultado de este select lo metes en un arrayList que llamamos todasHabitaciones (aquí tienes todas las habitaciones).

Las habitaciones ocupadas las tienes en otro arrayList denominado ocupadasAL

Puedes determinar las habitaciones libres haciendo lo siguiente (lo que hace este ejemplo, pero aplicándolo a tu código):

Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class prueba {
    public static void main (String Args[]){
        int i=0;
        List<Integer> todasHabitaciones = Arrays.asList(1, 5, 6, 9, 11, 14, 18, 32, 44);
        List<Integer> ocupadasAL = Arrays.asList(5, 9, 11, 44);
        List<Integer> libres = new ArrayList<Integer>();
        for (i=0; i<todasHabitaciones.size(); i++){
            if (ocupadasAL.contains(todasHabitaciones.get(i))) {
                // Está ocupada
                System.out.println("Habitacion " + todasHabitaciones.get(i) + " esta ocupada");
            } else {
                //Está libre
                libres.add(todasHabitaciones.get(i));

            }
        }
        System.out.println("Todas las habitaciones son: " + todasHabitaciones);
        System.out.println("Las habitaciones libres son: " + libres);
        System.out.println("Las habitaciones ocupadas son: " + ocupadasAL);
    }
}

dongo

  • Intermedio
  • ***
  • Mensajes: 177
    • Ver Perfil
Re:intervalos de fechas MySql para reservas en hotel
« Respuesta #14 en: 25 de Agosto 2014, 18:00 »
Hola, perdon por meterme. No se si lo que intentáis hacer es sacar las habitaciones libres de datos obtenidos de una tabla habitaciones y otra tabla reservas, pero no sería mas sencillo algo de este tipo:

Código: [Seleccionar]
SELECT * FROM habitaciones WHERE estado='Disponible' AND id_habitacion NOT IN(SELECT id_habitacion FROM RESERVAS);

Perdón por meterme pero es que os he leido y lo veo todo muy enrevesado....

Bueno un saludo y os seguiré leyendo a ver como acaba.

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re:intervalos de fechas MySql para reservas en hotel
« Respuesta #15 en: 25 de Agosto 2014, 18:08 »
Sí, la idea parece buena y no había contado con ese tipo de expresiones, pero realmente lo que va buscando no es simplemente que la habitación aparezca o no en la tabla de reservas. Lo que busca (si no me equivoco) es comprobar si la habitación está libre entre una fecha de solicitud de entrada y una fecha de solicitud de salida, con lo cual hay que meterse en comprobaciones de fechas. Quizás la habitación esté en la tabla de reservas, pero si la reserva no coincide con las fechas en que se solicita, la habitación está libre para esas fechas. Por eso le he planteado como se me ha ocurrido los tres posibles casos: la solicitud empieza antes y termina durante una reserva, la solicitud está dentro de las fechas de la reserva, o la solicitud empieza en la reserva y termina después del fin de la reserva. Esos serían los tres casos que veo para decir que la habitación está ocupada. Una vez determine si la habitación está en un caso de estos, puede responder si está ocupada o está libre.

Igual hay una forma más simple de hacerlo   ::) ::) ::)

dongo

  • Intermedio
  • ***
  • Mensajes: 177
    • Ver Perfil
Re:intervalos de fechas MySql para reservas en hotel
« Respuesta #16 en: 25 de Agosto 2014, 18:43 »
Pues no se, es que creo que el problema es querer solucionarlo todo con java, es decir, lo cojo todo y ahora lo proceso, y a veces olvidamos que las bases de datos poseen una gran capacidad para procesar y filtrar datos, sigo sin verle problema a lo que busca....

Si tenemos dos parámetros FECHA_INICIO_FILTRO y FECHA_FINAL_FILTRO

una sentencia del tipo:
Código: [Seleccionar]
select * from habitaciones where estado="Disponible" and id_habitacion
   not in(select id_habitacion from reservas where (FECHA_INICIO_FILTRO  beetwen fecha_inicio_reserva and  fecha_final_reserva )
 or
( FECHA_FINAL_FILTRO  beetwen fecha_inicio_reserva and fecha_final_reserva));
 
No se ejk tampoco tengo el detalle de como tiene este hombre las tablas de la base de datos, pero vamos que con una select, menos la cama, te lo puede hacer prácticamente todo...XDD
 
 Un saludo!!

Nota: He editado la select que estaba toda mal, ahora creo que si debería dar los datos de todas las habitaciones que no están reservadas en un rango de fecha dado....
« Última modificación: 25 de Agosto 2014, 19:30 por dongo »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re:intervalos de fechas MySql para reservas en hotel
« Respuesta #17 en: 25 de Agosto 2014, 19:32 »
Supón que una habitación está reservada del 10 al 15 de octubre. (día 10 es fechaInicioFiltro y día 15 fechaFinalFiltro)

La fecha en que se solicita es del 8 al 12 de octubre.

FECHA_INICIO_FILTRO < fecha_inicio_reserva and FECHA_FINAL_FILTRO < fecha_inicio_reserva no se cumple


FECHA_FINAL_FILTRO > fecha_final_reserva and FECHA_INICIO_FILTRO > fecha_final_reserva no se cumple


La habitación no consta como ocupada, pero sí está ocupada, ya que basta con que haya un solape para que la solicitud no se pueda materializar (en este caso se solapa del 10 al 12 de octubre).

Yo sigo empeñado en determinar las posibilidades (AUNQUE ME EDITO Y CAMBIO LO DICHO, antes había identificado 3 posibilidades pero ahora estoy viendo cuatro):

Ejemplo 1: Solicitud dentro del intervalo de la reserva. Solicito del 10 al 15 de octubre. Hay reserva del 5 al 20 de octubre

fechaSolicitadaDeEntrada >= fechaIngresoEnLaReserva y fechaSolicitadaDeSalida<= fechaSalidaEnLaReserva


Ejemplo 2: La reserva empezó antes pero se solapa con las fechas solicitadas. solicito del 10 al 15 de octubre. Hay reserva del 7 al 12 de octubre.

fechaSolicitadaDeEntrada > fechaIngresoEnLaReserva y fechaSolicitadaDeEntrada<= fechaSalidaEnLaReserva


Ejemplo 3: La reserva empieza después pero se solapa con las fechas solicitadas. solicito del 10 al 15 de octubre. Hay reserva del 13 al 18 de octubre.

fechaSolicitadaDeEntrada < fechaEntradaEnLaReserva y fechaSolicitadaDeSalida > fechaEntradaEnLaReserva


Ejemplo 4: la reserva queda dentro del periodo solicitado. Solicito del 10 al 15 de octubre. Hay reserva del 13 al 14 de octubre.

fechaSolicitadaDeEntrada< fechaEntradaEnLaReserva y fechaSolicitadaDeSalida > fechaSalidaEnLaReserva


En estos cuatro casos la habitación no está disponible para reserva, en otro caso sí está disponible.

Eligiendo del total de habitaciones las que no cumplen con estas condiciones, tendríamos las habitaciones libres.

Aunque plantearlo sin probarlo es difícil e igual ya estoy viendo doble


dongo

  • Intermedio
  • ***
  • Mensajes: 177
    • Ver Perfil
Re:intervalos de fechas MySql para reservas en hotel
« Respuesta #18 en: 25 de Agosto 2014, 20:16 »
Ya me he dado cuenta de que no era tan facil.

Pero me he picado XDD
A ver si gatoher nos puede adjuntar el script sql y así podríamos hacer pruebas...

Pero creo que esta se va acercando:

Código: [Seleccionar]
select * from habitaciones where estado="Disponible" and id_habitacion
   not in(select id_habitacion from reservas
where
 (FECHA_INICIO_FILTRO  beetwen fecha_inicio_reserva and  fecha_final_reserva )
 or
( FECHA_FINAL_FILTRO  beetwen fecha_inicio_reserva and fecha_final_reserva)
or
((FECHA_INICIO_FILTRO<fecha_inicio_reserva)
 and
(FECHA_FINAL_FILTRO> fecha_inicio_reserva))
or
((FECHA_FINAL_FILTRO>fecha_final_reserva)
 and
(FECHA_INICIO_FILTRO< fecha_final_reserva)));

es cuestión de currarsela, y cuando se tenga, solo hay que coger java realizar una consulta... y ya lo tienes...

Bueno si gatoher nos pasa el script.sql lo volveré a intentar hasta que salga porque ademas es un caso que no se mee había presentado en sql, comprobar si un rango pertenece a otro rango, mola sacar consultas kilometricas....XDDD

Un saludo!!

gatoher

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 86
    • Ver Perfil
Re:intervalos de fechas MySql para reservas en hotel
« Respuesta #19 en: 25 de Agosto 2014, 21:34 »
Hola Dongo gracias por participar. La verdad que no es nada sencillo. Subo el script aunque
no tienes las reglas de integridad referecial, "on delete cascade, on update cascade, etc".
La verdad que no he sabido exportar la bbdd desde MySql worbrench, si me lo podeis explicar guay.

Aqui el problema es que hay dos tablas y en una se almacenas las reservas con unas determinadas fechas de inicio y fin. Yo lo que quería era que al intentar ingresar  una reserva nueva se habre un JFram y pones las fechas que el cliente solicita. Y se te muestran las habitaciones que en esas fechas no estan ocupadas.

Yo lo estaba haciendo la select en la tabla de reservas, y es ahí donde yo pienso que esta el error, pues si me devuelve x ids de habitaciones luego no se trabajar con ellas.
Pues si intento hacer una select con varias idhabitaciones tengo que hacer un bucle para recorrer el Array y luego me machaca el resultado del JTable."Vamos que solo me aparece la última habitación que esta libre". Algo tipo:

Código: [Seleccionar]
//bucle para recorrer el array con las habitaciones ocupadas
for (int h = 0; h < habitacionesOcupadas.length; h++) {
            System.out.println("La longitud de habitacionesLibres es => " + habitacionesOcupadas.length); 
            sqlHabitacionesLibres = "Select distinct idhabitacion,numero,piso,descripcion, caracteristicas," +"\n" +
                    " precio_diario,estado, tipo_habitacion  from habitacion where idhabitacion != "+habitacionesOcupadas[h]+" ";

El problema viene cuando quieres almacenarlo en el modelo del JTable. Cada pasada del bucle for elimina los datos de la anterior iteración.

Por lo tanto hay que hacer la select, que devuelva desde la tabla habitaciones.

Subo el script.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".