Mysql
 sql >> Base de données >  >> RDS >> Mysql

Tarifs des chambres d'hôtel pour différentes saisons

Ayant travaillé dans un hôtel et écrit le système de réservation, le temps horaire n'est pas pertinent en ce qui concerne la facturation. Tout est toujours chargé la nuit. (Sauf si vous envisagez de gérer un lieu qui facture à l'heure!;-)) L'enregistrement et le départ sont des considérations opérationnelles.

N'utilisez pas de procédures stockées si vous souhaitez réellement écrire un véritable système de réservation. Cela va à l'encontre de l'objectif d'avoir une base de données.

De plus, écrire des dates comme celle-ci est le 2007-04-29 est vraiment un excellent moyen car tout le monde ne vient pas du même endroit et c'est une norme internationale. Notez également que si vous transformez ceci en une chaîne, elle sera toujours triée correctement !

Vous devez créer une table de calendrier car MySQL n'a pas de fonctions intégrées pour le faire. Cette procédure créera des dates pour vous.

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

Je vais ignorer les dates que vous avez données dans votre question et supposer que le client ne remonte pas le temps.

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

Et, comme vous pouvez le voir, le sql est assez concis et lisible sans recourir à des fonctions ou des procédures. Cela pourra évoluer correctement et traiter des questions plus complexes. En outre, cela permet d'utiliser la vérification référentielle puisque les données sont basées sur des tables.