Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Hotelzimmerpreise für verschiedene Jahreszeiten

Nachdem Sie in einem Hotel gearbeitet und das Reservierungssystem geschrieben haben, ist die Stundenzeit für die Abrechnung irrelevant. Alles wird immer nachts aufgeladen. (Es sei denn, Sie planen, einen Laden zu betreiben, der stundenweise abgerechnet wird!;-)) Check-in und Check-out sind operative Überlegungen.

Verwenden Sie keine gespeicherten Prozeduren, wenn Sie tatsächlich ein echtes Reservierungssystem schreiben wollen. Es macht den Zweck einer Datenbank zunichte.

Auch das Ausschreiben von Daten wie 2007-04-29 ist wirklich eine großartige Möglichkeit, da nicht alle vom selben Ort stammen und dies ein internationaler Standard ist. Beachten Sie auch, wenn Sie dies in eine Zeichenfolge umwandeln, wird es immer noch korrekt sortiert!

Sie müssen eine Kalendertabelle erstellen, da MySQL keine eingebauten Funktionen dafür hat. Diese Prozedur erstellt Daten für Sie.

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

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

Ich werde die Daten ignorieren, die Sie in Ihrer Frage angegeben haben, und davon ausgehen, dass der Kunde nicht in der Zeit zurückreist.

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

Und wie Sie sehen können, ist die SQL recht übersichtlich und lesbar, ohne auf Funktionen oder Prozeduren zurückgreifen zu müssen. Dies wird in der Lage sein, richtig zu skalieren und komplexere Fragen zu behandeln. Außerdem ermöglicht es die referenzielle Überprüfung, da die Daten tabellenbasiert sind.