Cambiar el valor booleano para cierto rango de fechas

Hola, estoy trabajando en un proyecto de reserva de hotel en ASP.NET. Quiero hacer un filtro para poder buscar la habitación disponible por fecha (por ejemplo entre el 1 de junio y el 5 de junio) y luego reservar esa habitación. ¿Cómo puedo hacer para cambiar el estado de esa habitación a "no disponible" para eso? período, para que alguien que quiera reservar esa habitación entre el 15 y el 30 de mayo pueda hacerlo. El estado de la habitación es un valor booleano en mi base de datos.

enter image description here

Hasta ahora, muestro todas las habitaciones con el estado disponible. Pero el estado se establece cuando introduzco la habitación en la base de datos. Pero no sé cómo cambiar el estado y si es posible establecer el estado de una habitación como verdadero durante un período y luego falso para otro período

preguntado el 03 de mayo de 12 a las 09:05

Para que todos entendamos, ¿quieres hacer algo como lo que hace Ticketmaster, en el que impide que se reserve la habitación mientras alguien realiza el proceso de reserva (y tal vez dice algo como "tienes dos minutos para reservar esta habitación")? -

Sí, algo como esto. Reservo una habitación para un período y después de eso, la habitación ya no está disponible para reservar para ese período. -

3 Respuestas

No se requiere un cambio en la estructura de la base de datos para lo que está solicitando, y para admitir una función de tiempo de espera descrita por MarkP3rry, solo necesita agregar un campo a su tabla de Reservas: BookingDate DATETIME. Debe comprobar la disponibilidad utilizando la tabla de reservas. Si no hay reservas para una habitación que superpongan las fechas de inicio y finalización proporcionadas, entonces la habitación estará disponible para ese período, a menos que la reserva haya sido cancelada.

Para determinar qué habitaciones están disponibles entre dos fechas, utilice la siguiente consulta:

SELECT r.*
FROM Room r LEFT JOIN Reservation v ON r.RoomID = v.RoomID
    AND NOT (@StartDate >= Date_Check_Out OR @EndDate <= Date_Check_In)
    AND v.cancel = 0
WHERE v.ReservationID IS NULL

Esto le dará todas las habitaciones que no tienen reservas contra entonces entre @StartDate y @EndDate. Por supuesto, puede filtrar esto aún más por estado de la habitación, tipo de habitación, etc. Esta consulta asume que se ha realizado la validación en las fechas proporcionadas, es decir, que @StartDate < @EndDate, Y que Reservation.Check_In_Date < Reservation.Check_Out_Date. La combinación devolverá todas las habitaciones y solo las reservas cuyas fechas coincidan con las fechas de inicio y finalización proporcionadas. Agregar AND v.cancel = 0 incluir únicamente las reservas que no han sido canceladas. Luego filtramos los resultados que tienen algún dato de reserva, y lo que queda son las habitaciones disponibles entre las dos fechas.

contestado el 03 de mayo de 12 a las 13:05

Gracias, esto es lo que estaba buscando. Ahora intentaré implementarlo, pero necesito convertirlo a linq y no sé cómo, pero lo resolveré de alguna manera. - jonny

En primer lugar, la estructura de su base de datos es incorrecta. Debe tener el campo de estado en la Tabla de reservas para que tenga el historial de transición en el día.

Porque en su estado actual, su habitación estará disponible todo el día o estará desactivada todo el día. Debe hacer una tabla de estado de la habitación en la que debe tener el registro del estado diario y validar su selección de habitación sobre la base de esa tabla.

Haga que el valor predeterminado para el estado sea verdadero. De modo que, de forma predeterminada, todas las habitaciones estarán disponibles para reservar de forma predeterminada.

@ianco slovak, realmente siento que debes cambiar la estructura de tu base de datos.

contestado el 03 de mayo de 12 a las 09:05

Realmente no entiendo qué debo guardar en la tabla de estado de mi habitación. ReservationID, RoomID, estado y alguna fecha? - jonny

Exactamente, requerirá todos estos campos en la tabla de estado de la habitación, y esta tabla debe tener una sola entrada para cada habitación todos los días. - Sheikh Farooque

El propósito del campo [Estado] es mostrar si la habitación está disponible por ahora, ¿no es así? En caso afirmativo, puede configurarlo como Computado: cree una función sql que devuelva booleano (tipo de su campo Estado) y verifique que no haya reserva para el momento actual.

Lea más sobre los campos calculados aquí y también sobre el rendimiento aquí

contestado el 03 de mayo de 12 a las 09:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.