Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Tarifas de quarto de hotel para diferentes estações


Tendo trabalhado em um hotel e escrito o sistema de reservas, o horário é irrelevante no que diz respeito ao faturamento. Tudo é sempre cobrado à noite. (A menos que você planeje administrar um lugar que cobra por hora!;-)) Check-in e check-out são considerações operacionais.

Não use procedimentos armazenados se você realmente deseja escrever um sistema de reservas real. Isso anula o propósito de ter um banco de dados.

Além disso, escrever datas como esta é 2007-04-29 é realmente uma ótima maneira porque nem todos são do mesmo lugar e este é um padrão internacional. Observe também que, se você transformar isso em uma string, ela ainda será classificada corretamente!

Você precisa criar uma tabela de calendário, pois o MySQL não possui funções embutidas para fazer isso. Este procedimento criará datas para você.
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

Vou ignorar as datas que você deu em sua pergunta e assumir que o cliente não está viajando para trás no tempo.
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

E, como você pode ver o sql é bastante conciso e legível sem recorrer a funções ou procedimentos. Isso será capaz de dimensionar adequadamente e lidar com questões mais complexas. Além disso, permite que a verificação referencial seja usada, pois os dados são baseados em tabelas.