След като сте работили в хотел и сте написали системата за резервации, почасовото време е без значение за таксуването на faras. Всичко винаги се зарежда през нощта. (Освен ако не планирате да управлявате място, което се таксува на час!;-)) Настаняването и напускането са оперативни съображения.
Не използвайте съхранени procuedure, ако наистина искате да напишете реална система за резервации. Това побеждава целта да имате база данни.
Освен това изписването на дати като тази е 2007-04-29 е наистина страхотен начин, защото не всички са от едно и също място и това е международен стандарт. Също така имайте предвид, че ако превърнете това в низ, той пак ще бъде сортиран правилно!
Трябва да направите календарна таблица, тъй като MySQL няма вградени функции, за да го направите. Тази процедура ще изгради дати за вас.
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');
от: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
Ще игнорирам датите, които сте посочили във вашия въпрос, и предполагам, че клиентът не пътува назад във времето.
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
И, както можете да видите, sql е доста сбит и четим, без да се прибягва до функции или процедури. Това ще може да се мащабира правилно и да се справя с по-сложни въпроси. Освен това позволява да се използва референтна проверка, тъй като данните са базирани на таблица.