sql >> Database teknologi >  >> RDS >> Mysql

Hotelværelsespriser for forskellige årstider

Efter at have arbejdet på et hotel og skrevet reservationssystemet, er timetiden irrelevant, når det gælder fakturering. Alt oplades altid om natten. (Medmindre du planlægger at drive et sted, der oplader pr. time!;-)) Indtjekning og udtjekning er operationelle overvejelser.

Brug ikke lagrede procedurer, hvis du rent faktisk ønsker at skrive et rigtigt reservationssystem. Det besejrer formålet med at have en database.

Det er også en rigtig god måde at skrive datoer som denne er 2007-04-29, fordi ikke alle er fra det samme sted, og dette er en international standard. Bemærk også, at hvis du skulle gøre dette til en streng, vil det stadig blive sorteret korrekt!

Du skal lave en kalendertabel, da MySQL ikke har indbyggede funktioner for at gøre det. Denne procedure vil opbygge datoer for dig.

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

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

Jeg vil ignorere de datoer, du har angivet i dit spørgsmål, og antage, at klienten ikke rejser tilbage i tiden.

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

Og som du kan se, er sql ret kortfattet og læsbar uden at ty til funktioner eller procedurer. Dette vil være i stand til at skalere korrekt og håndtere mere komplekse spørgsmål. Det gør det også muligt at bruge referencekontrol, da dataene er tabelbaserede.



  1. Hvorfor bruge en JOIN-klausul versus en WHERE-betingelse?

  2. Sådan opretter du et databasediagram i Access

  3. Træk og slip i MS Access og betinget sortering

  4. PHP mysql PDO nægter at indstille NULL-værdi