Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] BETWEEN al revés

Estas en el tema de BETWEEN al revés en el foro de Mysql en Foros del Web. Hola estimados, tengo un problema con una consulta la cual no se como formularla: Tengo una fecha de entrada y una fecha de salida la ...
  #1 (permalink)  
Antiguo 30/03/2016, 11:29
 
Fecha de Ingreso: febrero-2011
Mensajes: 108
Antigüedad: 13 años, 2 meses
Puntos: 4
BETWEEN al revés

Hola estimados, tengo un problema con una consulta la cual no se como formularla:

Tengo una fecha de entrada y una fecha de salida la cual registro en la base de datos para crear una reserva, por lo que tengo la siguiente tabla con registros:

reserva
id | fechain | fechaout
---------------------------------------
1 | 15/03/2016 | 17/03/2016
---------------------------------------

El problema es que yo quiero validar que otra reserva que ingrese no sea en la misma fecha que alguien haya reservado, le di muchas vueltas y la consulta que yo quiero hacer es preguntar si mis fechas de entrada y salida están dentro de un registro de la base de datos. De forma mas técnica sería una consulta así:

Código:
SELECT id FROM reserva WHERE $fechaingreso BETWEEN fechain AND fechaout OR $fechasalida BETWEEN fechain AND fechaout
Siendo $fechaingreso y $fechaslida lo que este intentando ingresar el usuario. Esto es en rigor lo que necesito preguntar pero evidentemente tengo varios errores, sobre todo que la consulta debería ser al revés en los BETWEEN

Código:
SELECT id FROM reserva WHERE fechain BETWEEN $fechaingreso AND $fechasalida OR fechaout BETWEEN $fechaingreso AND $fechasalida
Alguien me puede dar una luz de como debería consultar a la base de datos lo que requiero

EDITADO

Vengo del foro PHP y algunas personas me indicaron que acá debía dejar este tema. Una de ellas me daba la solución NOT BETWEEN como sigue:

Código:
SELECT id FROM reserva WHERE fechain NOT BETWEEN $fechaingreso AND $fechasalida OR fechaout NOT BETWEEN $fechaingreso AND $fechasalida
Pero supongamos que en la base de datos esta ingresada una reserva del 15/03/2016 al 18/03/2016 y un usuario quiere registrar otra reserva del 16/03/2016 al 17/03/2016 , la consulta anterior me daría 0 registros y con eso no podria controlar el ingreso de esta reserva.

Última edición por sefirotxx; 30/03/2016 a las 11:35
  #2 (permalink)  
Antiguo 30/03/2016, 11:41
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: BETWEEN al revés

Es un caso de manual, cuesta a veces entenderlo entero, pero estás cerca.
Para validar que algo que posee un rango no cae en el rango de otro registro se debe cumplir que:
- La fecha de inicio o de fin del nuevo rango no caiga dentro de un rango preexistente.
- El rango nuevo no debe solapar completamente a un rango registrado.

Esto devolvería las que se solapan:
Código MySQL:
Ver original
  1. SELECT id FROM reserva
  2.     $fechaingreso BETWEEN fechain AND fechaout
  3.     OR $fechasalida BETWEEN fechain AND fechaout
  4.     OR ($fechaingreso <= fechain  AND $fechasalida >= fechaout

Esto devolvería 0 si se cumple que el periodo está libre:
Código MySQL:
Ver original
  1. SELECT COUNT(*) solapadas
  2. FROM reserva
  3.     $fechaingreso BETWEEN fechain AND fechaout
  4.     OR $fechasalida BETWEEN fechain AND fechaout
  5.     OR ($fechaingreso <= fechain  AND $fechasalida >= fechaout
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 30/03/2016, 11:42
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: BETWEEN al revés

Y no crees que con la respuesta que te di aquí está ya solucionado?
  #4 (permalink)  
Antiguo 30/03/2016, 11:47
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: BETWEEN al revés

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Es un caso de manual, cuesta a veces entenderlo entero, pero estás cerca.
Para validar que algo que posee un rango no cae en el rango de otro registro se debe cumplir que:
- La fecha de inicio o de fin del nuevo rango no caiga dentro de un rango preexistente.
- El rango nuevo no debe solapar completamente a un rango registrado.
Lo siento gnzsoloyo te adelantaste, pero como siempre tu respuesta es más completa. Un saludo. Y espero que pueda solucionarlo.
  #5 (permalink)  
Antiguo 30/03/2016, 13:18
 
Fecha de Ingreso: febrero-2011
Mensajes: 108
Antigüedad: 13 años, 2 meses
Puntos: 4
Respuesta: BETWEEN al revés

Gracias gnzsoloyo, me costo pero entendí finalmente lo que me explicas. En mi caso particular una reserva puede ser iniciada el mismo día que termina otra o ser finalizada el mismo día que inicia otra por lo que, entendiendo como evito la solapacion y leyendo un poco el manual al que alude xerifandtomas, cambie el código como sigue:

Código SQL:
Ver original
  1. SELECT id FROM reserva
  2. WHERE
  3.     $fechaingreso >= fechain  AND $fechaingreso < fechaout
  4.     OR $fechasalida > fechain  AND $fechasalida <= fechaout
  5.     OR ($fechaingreso <= fechain  AND $fechasalida >= fechaout)

Bueno ahora un descanso, mi mente quedo haciendo cortocircuito. Agradecido, un abrazo a ambos.
  #6 (permalink)  
Antiguo 30/03/2016, 13:20
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: BETWEEN al revés



__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: fecha, registros, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:00.