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.