Habiendo trabajado en un hotel y escrito el sistema de reservas, el tiempo por hora es irrelevante en lo que respecta a la facturación. Todo se carga siempre por la noche. (¡A menos que planee administrar un lugar que cobra por hora!;-)) El check-in y el check-out son consideraciones operativas.
No utilice procedimientos almacenados si realmente desea escribir un sistema de reservas real. Esto anula el propósito de tener una base de datos.
Además, escribir fechas como esta es 2007-04-29 es una excelente manera porque no todos son del mismo lugar y este es un estándar internacional. ¡También tenga en cuenta que si convirtiera esto en una cadena, aún se ordenaría correctamente!
Necesita crear una tabla de calendario ya que MySQL no tiene funciones integradas para hacerlo. Este procedimiento generará fechas para usted.
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');
de: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
Voy a ignorar las fechas que proporcionó en su pregunta y asumiré que el cliente no está viajando hacia atrás en el tiempo.
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
Y, como puede ver, el sql es bastante conciso y legible sin recurrir a funciones o procedimientos. Esto podrá escalar correctamente y manejar preguntas más complejas. Además, permite utilizar la verificación referencial ya que los datos están basados en tablas.