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.