sql >> Database >  >> RDS >> Mysql

Hotelkamerprijzen voor verschillende seizoenen

Na in een hotel te hebben gewerkt en het reserveringssysteem te hebben geschreven, is de tijd per uur niet relevant voor wat betreft facturering. Alles wordt altijd 's nachts opgeladen. (Tenzij u van plan bent een plaats te runnen die per uur wordt opgeladen!;-)) Inchecken en uitchecken zijn operationele overwegingen.

Gebruik geen opgeslagen procedures als je echt een echt reserveringssysteem wilt schrijven. Het gaat voorbij aan het doel van het hebben van een database.

Ook is het schrijven van data zoals deze op 29-04-2007 een geweldige manier omdat niet iedereen van dezelfde plaats komt en dit een internationale standaard is. Merk ook op dat als je dit in een string zou veranderen, het nog steeds correct wordt gesorteerd!

U moet een kalendertabel maken omdat MySQL geen ingebouwde functies heeft om dit te doen. Deze procedure zal datums voor u opbouwen.

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');

van: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

Ik negeer de data die je in je vraag hebt gegeven en ga ervan uit dat de klant niet terug in de tijd reist.

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

En, zoals u kunt zien, is de sql vrij beknopt en leesbaar zonder toevlucht te nemen tot functies of procedures. Dit zal goed kunnen schalen en complexere vragen kunnen behandelen. Het maakt het ook mogelijk om referentiële controle te gebruiken, aangezien de gegevens op tabellen zijn gebaseerd.



  1. de MySQL-service op de lokale computer is gestart en vervolgens gestopt

  2. Hoe ADD_MONTHS() werkt in MariaDB

  3. MariaDB CURRENT_USER() uitgelegd

  4. SQLite-transactie