sql >> Base de Datos >  >> RDS >> Mysql

Tarifas de habitaciones de hotel para diferentes temporadas

Habiendo trabajado en un hotel y escrito el sistema de reservas, el tiempo por hora es irrelevante en lo que respecta a la facturación. Todo se carga siempre por la noche. (¡A menos que planee administrar un lugar que cobra por hora!;-)) El check-in y el check-out son consideraciones operativas.

No utilice procedimientos almacenados si realmente desea escribir un sistema de reservas real. Esto anula el propósito de tener una base de datos.

Además, escribir fechas como esta es 2007-04-29 es una excelente manera porque no todos son del mismo lugar y este es un estándar internacional. ¡También tenga en cuenta que si convirtiera esto en una cadena, aún se ordenaría correctamente!

Necesita crear una tabla de calendario ya que MySQL no tiene funciones integradas para hacerlo. Este procedimiento generará fechas para usted.

drop table if exists calendar;
create table calendar 
( 
    date_       date        primary key
);

drop procedure fill_calendar;

delimiter $$
create procedure fill_calendar(start_date date, end_date date)
begin
  declare date_ date;
  set date_=start_date;
  while date_ < end_date do
    insert into calendar values(date_);
    set date_ = adddate(date_, interval 1 day);
  end while;
end $$
delimiter ;

call fill_calendar('2007-1-1', '2007-12-31');

de:http://www.ehow.com/how_7571744_mysql-calendar-tutorial.html

drop table if exists rates;
create table rates
(
    season          varchar(100)    primary key,
    start_date      date            references calendar(date_),
    end_date        date            references calendar(date_),
    rate            float
);
insert into rates values ('Low',    '2007-01-01',   '2007-04-30',   100.00);
insert into rates values ('High',   '2007-05-01',   '2007-08-31',   150.00);
insert into rates values ('Peak',   '2007-09-01',   '2007-12-21',   200.00);

select * from rates;
season  start_date      end_date        rate
Low     2007-01-01      2007-04-30      100
High    2007-05-01      2007-08-31      150
Peak    2007-09-01      2007-12-21      200

Voy a ignorar las fechas que proporcionó en su pregunta y asumiré que el cliente no está viajando hacia atrás en el tiempo.

select
    date_, rate
    from calendar
    join rates
        on date_ >= start_date and date_ <= end_date

    where date_ between '2007-04-29' and '2007-5-01'
;
date_   rate
2007-04-29      100
2007-04-30      100
2007-05-01      150

select
    sum(rate)

    from calendar
    join rates
        on date_ >= start_date and date_ <= end_date

    where date_ between '2007-04-29' and '2007-5-01'
sum(rate)
350

Y, como puede ver, el sql es bastante conciso y legible sin recurrir a funciones o procedimientos. Esto podrá escalar correctamente y manejar preguntas más complejas. Además, permite utilizar la verificación referencial ya que los datos están basados ​​en tablas.