Ayuda con una consulta usando procedimientos almacenados

Iniciado por S4ms3pi0l__, 23 Marzo 2019, 03:54 AM

0 Miembros y 1 Visitante están viendo este tema.

S4ms3pi0l__

Bien, tengo la siguiente base de datos:

Código (sql) [Seleccionar]

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:

Código (sql) [Seleccionar]

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'

EdePC

Saludos,

- He estado haciendo unoas pruebas con lo siguiente y me parece que se puede adaptar a lo que necesitas

Código (sql) [Seleccionar]
/******************/
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 |
+------------+------------+

S4ms3pi0l__

¡Muchas gracias! Es justamente lo que necesitaba.