ホテルで働いて予約システムを作成したので、請求が行われる限り、1時間ごとの時間は関係ありません。すべては常に夜に課金されます。 (時間単位で課金される場所を運営する予定がない限り!;-))チェックインとチェックアウトは運用上の考慮事項です。
実際に実際の予約システムを作成したい場合は、保存された手順を使用しないでください。データベースを持つという目的が損なわれます。
また、このように日付を書き出すのは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は非常に簡潔で、関数やプロシージャに頼ることなく読みやすくなっています。これにより、適切にスケーリングし、より複雑な質問を処理できるようになります。また、データはテーブルベースであるため、参照チェックを使用できます。