Tengo una pregunta en referencia a una consulta a la base de datos. Tengo esta tabla:

enter image description here

En otra ventana, tengo un formulario con entradas de fecha de inicio y finalización y quiero hacer un sql para confirmar si la habitación 23 está disponible entre estas fechas, todos los días. Intento con este sql:

SELECT * FROM this_table 
WHERE room_type_id=23 
AND date="2018-03-06 00:00:00" 
AND date="2018-03-07 00:00:00" 
AND date="2018-03-08 00:00:00" 
AND date="2018-03-09 00:00:00"

Esta consulta no funciona porque está verificando si alguna fila tiene todas las fechas.

Mi pregunta es: ¿cómo puedo verificar si la habitación está disponible en estos días?

1
Argoitz 27 feb. 2018 a las 18:34

6 respuestas

La mejor respuesta

Esto responderá a su pregunta particular con sí o no. No estoy seguro de que sea útil ya que los valores de búsqueda de fecha son específicos en una lista codificada.

select coalesce(max('no'), 'yes') as available
from tbl t           
where room_type_id = 23 and
    dt in ("2018-03-06 00:00:00", "2018-03-07 00:00:00", 
           "2018-03-08 00:00:00", "2018-03-09 00:00:00");

Si el sentido de su lógica está destinado a encontrar al menos una fecha de apertura , entonces puede intentar algo como esto:

select case when count(*) = 4 then 1 else 0 end as whatever_this_means
from tbl t
where room_type_id = 23 and
    dt in ("2018-03-06 00:00:00", "2018-03-07 00:00:00", 
           "2018-03-08 00:00:00", "2018-03-09 00:00:00");

El problema será que ahora ha codificado el valor 4 ahora, que está vinculado al número de fechas en la lista más adelante en la consulta. Hay maneras de manejar esto de manera más dinámica, pero no es del todo claro a partir de su pregunta la mejor manera de hacerlo.

1
shawnt00 27 feb. 2018 a las 17:03

¿Quizás usando OR en lugar de AND entre las fechas?

SELECT * FROM this_table 
WHERE room_type_id=23 AND 
(date="2018-03-06 00:00:00" OR
date="2018-03-07 00:00:00" OR
date="2018-03-08 00:00:00" OR
date="2018-03-09 00:00:00")
0
Golden Ratio 27 feb. 2018 a las 15:45

Si 'this_table' almacena espacio disponible, puede devolver 0 o 1 con este truco:

Cuente la cantidad de días disponibles:

SELECT room_type_id, Count(*) as Av_days
FROM this_table
WHERE room_type_id=23 AND date BETWEEN @StartDate AND @ EndDate GROUP BY room_type_id

Luego prueba la igualdad:

SELECT (DATEDIFF(@EndDate, @StartDate) = Av_days )
 FROM
  (SELECT room_type_id, Count(*) as Av_days
  FROM this_table
   WHERE room_type_id=23 AND date BETWEEN @StartDate AND @ EndDate
  GROUP BY room_type_id) t

Si tiene el mismo número de días, devolverá 1 más 0

0
Daniel E. 27 feb. 2018 a las 16:25

Necesita usar OR en lugar de AND. Su estado de cuenta solo devolverá un resultado si la habitación 23 es igual a las 4 de las fechas mencionadas.

SELECT * FROM this_table 
WHERE room_type_id=23 
AND 
(
   date="2018-03-06 00:00:00" 
OR date="2018-03-07 00:00:00" 
OR date="2018-03-08 00:00:00" 
OR date="2018-03-09 00:00:00"
)
-1
ComputersAreNeat 27 feb. 2018 a las 15:46

Shawnt00 me da una buena idea. Modifico un poco esta consulta cambiando las respuestas de sí y no y funciona para mí.

select case when count(*) < 4 then 'no' else 'yes' end as available
from room_type_day t
where room_type_id = 23 and
    date in ("2018-03-07 00:00:00","2018-03-08 00:00:00","2018-03-09 00:00:00","2018-03-10 00:00:00");
0
Cœur 30 abr. 2018 a las 12:02

Si almacena información de la habitación dentro de db cuando alguien la reserva todos los registros muestran que la habitación no está vacía en su fecha, ahora si tiene otra tabla que almacena los nombres de las habitaciones, puede seleccionar las habitaciones que no existen en ninguna fecha para ellos

SELECT room_id FROM rooms WHEN room_id NOT IN (SELECT room_id FROM reserveTable WHERE date BETWEEN @StartDate AND @EndDate)

Pero si almacena habitaciones vacías en db (puede ser una base de datos sucia ;-)) puede seleccionar habitaciones que estén entre sus fechas,

SELECT room_id FROM reserveTable WHEN date BETWEEN @StartDate AND @ EndDate

Finalmente, depende de la estructura de su base de datos y su definición de formulario.
espero que esto te ayude a encontrar una buena solución

0
Farrokh 27 feb. 2018 a las 16:04