Avendo lavorato in un hotel e scritto il sistema di prenotazione, il tempo orario è irrilevante per quanto riguarda la fatturazione. Tutto è sempre addebitato di notte. (A meno che tu non preveda di gestire un posto a tariffa oraria!;-)) Il check-in e il check-out sono considerazioni operative.
Non utilizzare gli appalti archiviati se vuoi effettivamente scrivere un vero e proprio sistema di prenotazione, vanifica lo scopo di avere un database.
Inoltre, scrivere date come questa è 2007-04-29 è davvero un ottimo modo perché non tutti provengono dallo stesso posto e questo è uno standard internazionale. Nota anche che se dovessi trasformarlo in una stringa, sarà comunque ordinato correttamente!
Devi creare una tabella di calendario poiché MySQL non ha funzioni integrate per farlo. Questa procedura creerà le date per te.
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');
da: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
Ignorerò le date che hai fornito nella tua domanda e presumo che il cliente non stia viaggiando indietro nel tempo.
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
E, come puoi vedere, sql è abbastanza conciso e leggibile senza ricorrere a funzioni o procedure. Questo sarà in grado di ridimensionare correttamente e gestire domande più complesse. Inoltre, consente di utilizzare il controllo referenziale poiché i dati sono basati su tabelle.