Po práci v hotelu a sepsání rezervačního systému je hodinová doba irelevantní, pokud jde o fakturaci. Vše se účtuje vždy v noci. (Pokud neplánujete provozovat místo, které účtuje každou hodinu!;-)) Check-in a check-out jsou provozní aspekty.
Pokud skutečně chcete napsat skutečný rezervační systém, nepoužívejte uložené postupy. To maří účel databáze.
Také vypsat data, jako je toto, je 2007-04-29, je opravdu skvělý způsob, protože ne každý je ze stejného místa a toto je mezinárodní standard. Všimněte si také, že pokud to změníte na řetězec, bude stále správně seřazen!
Potřebujete vytvořit kalendářovou tabulku, protože MySQL nemá vestavěné funkce, abyste to udělali. Tento postup vytvoří data za vás.
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');
z: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
Budu ignorovat data, která jste uvedli ve své otázce, a předpokládám, že klient necestuje pozpátku v čase.
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
A jak můžete vidět, sql je docela stručný a čitelný, aniž byste se museli uchylovat k funkcím nebo procedurám. To bude schopno správně škálovat a zvládnout složitější otázky. Umožňuje také použití referenční kontroly, protože data jsou založena na tabulce.