Efter att ha arbetat på ett hotell och skrivit bokningssystemet är timtid irrelevant när det gäller fakturering. Allt laddas alltid på natten. (Om du inte planerar att driva ett ställe som tar betalt per timme!;-)) Incheckning och utcheckning är operativa överväganden.
Använd inte lagrade procedurer om du verkligen vill skriva ett riktigt bokningssystem. Det motverkar syftet med att ha en databas.
Att skriva ut datum som detta är 2007-04-29 är också ett riktigt bra sätt eftersom inte alla är från samma plats och detta är en internationell standard. Lägg också märke till att om du skulle förvandla detta till en sträng kommer den fortfarande att sorteras korrekt!
Du måste skapa en kalendertabell eftersom MySQL inte har inbyggda funktioner för att göra det. Denna procedur kommer att bygga upp datum åt dig.
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');
från: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
Jag kommer att ignorera datumen du har angett i din fråga och anta att klienten inte reser bakåt i tiden.
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
Och som du kan se är sql ganska kortfattad och läsbar utan att tillgripa funktioner eller procedurer. Detta kommer att kunna skala ordentligt och hantera mer komplexa frågor. Det gör det också möjligt att använda referenskontroll eftersom data är tabellbaserad.