Bien, tengo la siguiente base de datos:
CREATE DATABASE Hotel
GO
use Hotel;
GO
create table tipo_habitacion(
cod_tipo integer primary key,
nom_tipo varchar(25) not null,
precio money not null
);
create table habitacion(
no_habitacion integer primary key,
cod_tipo integer foreign key references tipo_habitacion(cod_tipo),
descr varchar(60),
cap integer not null,
stat varchar(15)
);
create table cliente(
id_cliente integer primary key identity(0,1),
p_nom varchar(15),
s_nom varchar(15),
p_apell varchar(15),
s_apell varchar(15),
direccion varchar(70),
tel varchar(10),
correo varchar(25)
);
create table empleado(
id_empleado integer primary key identity(0,1),
p_nom varchar(15),
s_nom varchar(15),
p_apell varchar(15),
s_apell varchar(15),
direccion varchar(70),
tel varchar(10),
correo varchar(25)
);
create table reserva(
id_reserva integer primary key identity(0,1),
id_cliente integer foreign key references cliente(id_cliente),
id_empleado integer foreign key references empleado(id_empleado),
fecha_reserva date not null,
forma_pago varchar(15),
divisa varchar(3),
stat varchar(15)
);
create table habitacion_reserva(
id_hab_reserva integer primary key identity(0,1),
id_habitacion integer foreign key references habitacion(no_habitacion),
id_reserva integer foreign key references reserva(id_reserva),
fecha_entrada date not null,
fecha_salida date not null,
precio money
);
create table huesped(
id_huesped integer primary key identity(0,1),
p_nom varchar(15),
s_nom varchar(15),
p_apell varchar(15),
s_apell varchar(15),
direccion varchar(70),
tel varchar(10),
nacionalidad varchar(25),
correo varchar(25)
);
create table huesped_hab_reserva(
id_huesped int foreign key references huesped(id_huesped) not null,
id_hab_reserva int foreign key references habitacion_reserva (id_hab_reserva) not null
);
alter table huesped_hab_reserva
add primary key(id_huesped, id_hab_reserva);
create table servicio(
id_servicio integer primary key identity(0,1),
descr varchar(60),
precio money
);
create table cargos_servicios(
id_servicio int foreign key references servicio (id_servicio) not null,
id_hab_reserva int foreign key references habitacion_reserva (id_hab_reserva) not null, precio money
);
alter table cargos_servicios
add primary key(id_servicio, id_hab_reserva);
El problema es el siguiente:
Realizar un procedimiento almacenado que reciba como parámetro: ID Habitación, Fecha de Entrada, Fecha de Salida.
Consultar la disponibilidad de la habitación en cuanto a las fechas solicitadas mediante un estado.
Ejemplo:
Entrada
IdHabitación: 2
Fecha de Entrada: 2019-03-14
Fecha de Salida: 2019-03-20
Ejecución
Fecha Estado
2019-03-14 Disponible
2019-03-15 Disponible
2019-03-16 Disponible
2019-03-17 Disponible
2019-03-18 Disponible
2019-03-19 Disponible
2019-03-20 Salida
En caso que exista una reserva en los días solicitados el estado será: "Reservado". El estado del último día debe ser: "Salida" y no ocupa implica una reserva.
Llevo atascado en eso desde hace varios días, y lo último que pude hacer fue esto:
CREATE PROCEDURE Disponibilidad @FechaEntrada date,
@FechaSalida date,
@IdHabitación int
AS
SELECT
hr.fecha_entrada,
r.stat AS Estado
FROM habitacion_reserva hr
INNER JOIN reserva r ON r.id_reserva = hr.id_reserva
INNER JOIN habitacion h ON h.no_habitacion = hr.id_habitacion
WHERE r.fecha_reserva NOT BETWEEN @FechaEntrada AND @FechaSalida
AND hr.id_habitacion = @IdHabitación
EXEC Disponibilidad '2019-04-01', '2019-04-10', 2
Y obviamente está incorrecto, así que, espero que sean de gran ayuda ya que la resolución de ese problema es de 'vida o muerte'
Saludos,
- He estado haciendo unoas pruebas con lo siguiente y me parece que se puede adaptar a lo que necesitas
/******************/
CREATE TABLE habitacion_reserva (
id_habitacion INTEGER,
fecha_entrada DATE NOT NULL,
fecha_salida DATE NOT NULL
)
INSERT INTO habitacion_reserva VALUES
(1, '2019-03-01', '2019-03-05')
/**********************/
CREATE PROCEDURE SP_Disponibilidad
@id_habitacion INTEGER,
@fecha_entrada DATE,
@fecha_salida DATE
AS BEGIN
DECLARE @ocupado INTEGER
DECLARE @tmp_table TABLE (
fecha DATE,
estado VARCHAR(10)
)
WHILE ( @fecha_entrada <= @fecha_salida )
BEGIN
SET @ocupado = (
SELECT COUNT(*)
FROM habitacion_reserva
WHERE id_habitacion = @id_habitacion
AND @fecha_entrada BETWEEN fecha_entrada AND fecha_salida
)
IF ( @ocupado > 0 )
INSERT INTO @tmp_table VALUES ( @fecha_entrada, 'Reservado' )
ELSE
INSERT INTO @tmp_table VALUES ( @fecha_entrada, 'Disponible' )
SET @fecha_entrada = DATEADD( DAY, 1, @fecha_entrada )
END
SELECT * FROM @tmp_table
END
/********************************/
EXECUTE SP_Disponibilidad 1, '2019-03-03', '2019-03-09'
+------------+------------+
| Fecha | Estado |
+------------+------------+
| 2019-03-03 | Reservado |
| 2019-03-04 | Reservado |
| 2019-03-05 | Reservado |
| 2019-03-06 | Disponible |
| 2019-03-07 | Disponible |
| 2019-03-08 | Disponible |
| 2019-03-09 | Disponible |
+------------+------------+
¡Muchas gracias! Es justamente lo que necesitaba.