1. Con una cuenta podrás:

    • Publicar preguntas y pedir ayuda
    • Crear tutoriales
    • Acceder a contenido privado
    • Convertirte en un Héroe de la web
    Cerrar notificación
  2. Eres nuevo en la comunidad y necesitas ayuda?
    Sigue estos pasos y recomendaciones antes de publicar tu duda:
    Cerrar notificación

Ayuda Rangos de Fechas

Tema en 'PHP y MySQL' comenzado por roger, 3 de Enero de 2017.

Estado del tema:
No está abierto para más respuestas.
  1. roger

    roger Miembro

    Se incorporó:
    22 de Enero de 2015
    Mensajes:
    32
    Me gusta recibidos:
    8
    Puntos de trofeos:
    8
    Género:
    Hombre
    Hola muy buenas Heroes.

    Estoy haciendo una pagina web de (Hoteles) y estoy en el tema de las reservas y me he quedado atascado en el tema de las fechas.

    Explicación: Resulta que un hotel tiene varias habitaciones en mi caso tiene 5 pero se pueden ampliar, Lo que quiero hacer es que el sistema sea capaz de detectar mediante un rango de fechas si esa habitación esta siendo utilizada o no?

    Mi pregunta es como puedo hacer que una sentencia sea capaz de hacer eso.

    No quiero que me lo hagáis quiero un ejemplo básico para yo enseñarme a hacerlo por que si me lo hacéis no me enseño y no tiene gracia.


    La base de datos esta formada lo siguente.

    id => ID
    ID_USUARIO => el id del usuario.
    beginning_date => fecha de inicio
    finishing_date => fecha final
     
  2. AngelKrak

    AngelKrak Miembro conocido

    Se incorporó:
    29 de Abril de 2015
    Mensajes:
    1.039
    Me gusta recibidos:
    436
    Puntos de trofeos:
    83
    Género:
    Hombre
    Ocupación:
    Freelancer
    Localización:
    Guadalajara
    Página web:
    y por que no haces una columna donde te diga si esta ocupado o no?
    y ya mediante un SELECT WHERE indicas si esta ocupado o no
     
    A Dawud le gusta esto.
  3. oscar fernando

    oscar fernando Miembro Activo

    Se incorporó:
    20 de Noviembre de 2015
    Mensajes:
    105
    Me gusta recibidos:
    54
    Puntos de trofeos:
    28
    Género:
    Hombre
    Ocupación:
    Estudiante
    Localización:
    colombia
    Que tal amigo respondo a lo que pides te hice un pequeño ejemplo
    1- Oviamente el formulario para pasar el rango de las fechas mas o menos asi
    HTML:
    <!DOCTYPE html>
    <html>
    <head>
        <title>Fecha Venta</title>
    </head>
    <body>
    <form  action="buscar.php" method ="GET">
      <h3>Buscar Vehiculos vendidos entre fechas</h3>
             <input type ="date" name ="buscar" id="buscar" >
              <input type ="date" name ="buscar2" id="buscar">
              <input type="submit" value="Buscar" id="boton">
    </form>

    </body>
    </html>
    2- El archivo php donde captures los valores de los inputs y generes la consulta
    PHP:
    <?php
    require('../conexion.php'); // traes la conexion de la base de datos me imagino que sabras hacerla
    $buscar=$_GET['buscar']; // capturas el valor de los inputs
    $buscar2=$_GET['buscar2'];

    $sql2= mysqli_query($mysqli,"SELECT c.ID_CLIENTE, c.NOMBRE as NOMBRE, c.IDENTIFICACION as CEDULA,
    k.MARCA AS MARCA, k.MODELO AS MODELO, k.PRECIO_VEHICULO AS PRECIO, v.FECHA_VENTA AS FECHA_VENTA,
    v.PLACA AS PLACA, v.SALDO_FINAL AS SALDO_FINAL FROM CLIENTE c, VEHICULO_VENDIDO v, CATALOGO  k
    WHERE c.ID_CLIENTE = v.ID_CLIENTE and v.ID_CATALOGO = k.ID_CATALOGO
    and v.FECHA_VENTA between '{$buscar}' and '{$buscar2}'"
    ); // realizas la consulta, como vez lo importante es el between
    $fecth2 = mysqli_fetch_array($sql2);
    ?>

    <table border="1">

    <tr>
    <th>ID</th> // muestras los campos de la consulta
    <th>NOMBRE</th>
    <th>CEDULA</th>
    <th>MARCA</th>
    <th>MODELO</th>
    <th>PRECIO</th>
    <th>FECHA DE VENTA</th>
    <th>PLACA</th>
    <th>SALDO</th>

    </tr>
    <?php do { ?>
    <tr>
    <td><?php echo $fecth2['ID_CLIENTE']; ?></td>
    <td><?php echo $fecth2['NOMBRE'] ;?></td>
    <td><?php echo $fecth2['CEDULA'];?></td>
    <td><?php echo $fecth2['MARCA']; ?></td>
    <td><?php echo $fecth2['MODELO']; ?></td>
    <td><?php echo $fecth2['PRECIO']; ?></td>
    <td><?php echo $fecth2['FECHA_VENTA']; ?></td>
    <td><?php echo $fecth2['PLACA']; ?></td>
    <td><?php echo $fecth2['SALDO_FINAL']; ?></td>



    </tr>
    <?php } while ($fecth2 = mysqli_fetch_array($sql2)); ?>
    // finalmente recorres y muestras los resultados y eso es todo es un ejemplo muy sencillo.
    Ahora no se como estes haciendo tu proyecto y como esta armada tu base de datos pero lo que dice AngelKrak es cierto y seria lo correcto de hacer
    ejemplo me imagino que tienes una tabla habitaciones que se yo donde tenga el
    ____________________
    Habitacion
    ____________________
    id_habitacion
    numero_habitacion
    Tipo
    Estado // como dice AngelKrak donde dira si esta ocupado o no
    ___________________
    ya luego solo haces un select que te muestre las habitaciones ocupadas y las que estan disponibles, y ya no se por que dices que con un rango de fechas saber cual esta ocupada y cual no es un poco raro, no crees eso ya haria parte de un reporte yo solo te ayude en lo que pides no se si sea de ayuda espero que te sirva.
     
    A AngelKrak le gusta esto.
  4. Dawud

    Dawud Miembro conocido

    Se incorporó:
    4 de Abril de 2016
    Mensajes:
    375
    Me gusta recibidos:
    292
    Puntos de trofeos:
    63
    Género:
    Hombre
    Ocupación:
    Estudiante
    Localización:
    Villahermosa, Tabasco
    La idea que menciona @AngelKrak es buena ya que puedes agregar una nueva columna, el cual mediante una setencia sql podrás obtener los hoteles ocupados y cuales no están ocupados....

    Bueno en si el otro compañero te resolvió el problema como realizar el comportamiento de un rango de fechas de la base de datos el cual solo implementando between fecha1 and fecha2 y además puedes anexar dentro de la setencia sql el nuevo atributo de si esta ocupado o no.

    Sin puede haber otra forma de hacerlos... pero con la setencia between que proporciona sql es mejor.....
     
    A AngelKrak y oscar fernando les gusta esto.
  5. roger

    roger Miembro

    Se incorporó:
    22 de Enero de 2015
    Mensajes:
    32
    Me gusta recibidos:
    8
    Puntos de trofeos:
    8
    Género:
    Hombre
    Hola a todos la idea que me decís de crear una tabla nueva no lo puedo hacer por que esa misma habitación puede tener dias que este activada y otras que no.

    Sobre el tema de los between lo he probado y no he conseguido hacerlo he conseguido lo siguiente

    Código (Text):
    SELECT * FROM `offers` WHERE (`beginning_date` >='2016-12-01' or `finishing_date` <='2016-12-09') and `id_usuario` = '190' and `type` = 'content'
    Pero en ocasiones no me funciona ejemplo

    habitación 1 fecha de inicio 1 de enero y fecha de final el 20 de enero
    si otro usuario cambia la fecha de inicio o la del final por ejenplo asi

    habitación 1 fecha de inicio 3 de enero fecha de final el 22 de enero el sistema lo da como valido y en verdad no lo tendria que dar por que esta la habitación reservada por el primer ejemplo



    Lo que quiero llegar a hacer es si hay una habitación en un radio de fechas no deje registrar en el caso que otro cliente tenga algo entre esa fecha
     
  6. Dawud

    Dawud Miembro conocido

    Se incorporó:
    4 de Abril de 2016
    Mensajes:
    375
    Me gusta recibidos:
    292
    Puntos de trofeos:
    63
    Género:
    Hombre
    Ocupación:
    Estudiante
    Localización:
    Villahermosa, Tabasco
    Mira no se como tengas tu base de datos creada :cool:..!! Pero de lo dices es que si un USUARIO tiene registrado una habitación con la siguiente fecha 1 al 20 de enero, esa sería la primera fila registrada en tu Tabla habitacion de tu base de datos como el siguiente ejemplo:


    ID: 1,
    Cliente: Dawu89,
    Num_habitacion: 345,
    Reservado: SI,
    to_fecha: 04/01/2017
    from_fecha: 10/01/2017 ..., Puede haber más datos.

    supongamos que tenemos 5 registros mas

    2, AngelKrak, 102, SI, 02/01/2017, 025/01/2017
    3, Gammafp, 224, SI, 05/01/2017, 020/01/2017
    4, Kauro, 201, SI, 10/01/2017, 15/01/2017
    5, Roger, 132, SI, 15/01/2017, 02/02/2017
    6, Oscar Fernando, 56, SI, 20/01/2017, 08/02/2017

    En el cual si analizas adecuadamente tienes dos tipos de fechas en este caso TO_FECHA & FROM_FECHA al utilizar el between solo trabaja para una columna por ejemplo

    Código (Text):
    SELECT * FROM habitacion WHERE to_fecha between '04-01-2017' and '15-01-2017';
    Esta sentecia ejecuta la funcion between el cual compara las fechas definidas y daría como resultado:

    1 Dawud89
    3 Gammafp
    4 Kauro
    5 Roger

    pero al realizar el siguiente tipo de consulta

    Código (Text):

    SELECT * FROM `offers` WHERE (`beginning_date` >='2016-12-01' or `finishing_date` <='2016-12-09') and `id_usuario` = '190' and `type` = 'content'
     
    Esta mal nunca te devolverá los resultados que defines, porque en si:
    • Estas definiendo que el id de usuario sea igual 190.
    • El type no se a que te refieres solo dice que si es igual content.
    • Otro es que mencionas donde WHERE beginning_date sea mayor e igual 2016-12-01 ó donde finishing_date sa menor e igual a 2016-12-09 en el cual esta comparando que si en la fecha de la columna beginnign_date te imprima las fechas aunque se encuentren después de la fecha 2016-12-09 el cual por que no tiene definida u otra condición donde que menciones hasta que fecha quieres mostrar de la primera columna fecha si no que se lo estás declarando a la segunda columna fecha, sin embargo la columna llamada finishing_date no esta dentro de la columna beginning_date si no es otra diferente que define que te imprima las fechas menores de 2016-12-09...
    Así que la condición que realizas no te resolverá el problema de acuerdo al operador que usas y además defines le id del cliente especifico, el cual si lo defines no tendría sentido realizar el rango de fechas o solamente que el cliente este registrado mas de una vez, por ejemplo: 20 veces ha reservados una habitación ya ese sería como un historial mas adecuado...

    Bueno aquí te muestro las siguientes capturas de una base de datos en el cual aplico tu setencia sql que mencionas anteriormente...

    Una base de datos el cual muestro al final las fechas... bd_dawud89.jpg

    Aplicando ahora tu setencia mencionada sin el id ya que si lo colocará el id = 5 me mostrará solamente esa línea definida por el id, y como resultado me imprime todas las fechas de acuerdo a lo que mencione anteriormente.

    bd_example1_dawud89.jpg


    Está imagen realiza la consulta de acuerdo a la setencia que mencionaste solo que corrigiendo algo el cual esta mencionado anteriormente.

    bd_example2_dawud89.jpg

    Bueno y esta es la misma imagen ya que en este aplico el uso de between como puedes apreciar se muestra una línea de la setencia sql. OJO el between solo aplicará de acuerdo a la columna especifica.

    bd_example3_dawud89.jpg

    En fin ami me funcionó usando las dos formas el uso de between, siempre y cuando especificando a la columna seleccionada y la setencia que defines anteriormente...
    SALUDOS y espero verte dado una idea.... :rolleyes::)
     
    Última modificación: 4 de Enero de 2017
    A AngelKrak y oscar fernando les gusta esto.
  7. AngelKrak

    AngelKrak Miembro conocido

    Se incorporó:
    29 de Abril de 2015
    Mensajes:
    1.039
    Me gusta recibidos:
    436
    Puntos de trofeos:
    83
    Género:
    Hombre
    Ocupación:
    Freelancer
    Localización:
    Guadalajara
    Página web:
    nunca mejor explicado y si no entiende o no puede pues es mejor que le pague a alguien y que le haga lo que quiere si no sera muy complicado o eso pienso yo por lo menos jejeje xD
     
    A Dawud le gusta esto.
  8. Dawud

    Dawud Miembro conocido

    Se incorporó:
    4 de Abril de 2016
    Mensajes:
    375
    Me gusta recibidos:
    292
    Puntos de trofeos:
    63
    Género:
    Hombre
    Ocupación:
    Estudiante
    Localización:
    Villahermosa, Tabasco
    :D hehehe fue solamente una idea simple ... Además cualquier cosa @AngelKrak esta disponible :)...
    No era complicado como mencionas solo se tiene que analizar u observar la base de datos y definir los atributos que vas a manejar adecuadamente, antes de ponerse a programar.
     
    A AngelKrak le gusta esto.
  9. roger

    roger Miembro

    Se incorporó:
    22 de Enero de 2015
    Mensajes:
    32
    Me gusta recibidos:
    8
    Puntos de trofeos:
    8
    Género:
    Hombre
    Muchas gracias por el tutorial me a servidor de mucho por que no me aclaraba en las fechas y gracias a tu tutorial ya lo entendí muchas a gracias a todos por ayudarme tan rápidamente Ya podéis cerrar el tema
     
Estado del tema:
No está abierto para más respuestas.

Comparte esta página