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.