Đã từng làm việc trong một khách sạn và viết hệ thống đặt phòng, thời gian hàng giờ không liên quan như việc lập hóa đơn đi xa. Mọi thứ luôn được tính phí vào ban đêm. (Trừ khi bạn định kinh doanh một nơi tính phí theo giờ!;-)) Nhận và trả phòng là những cân nhắc về hoạt động.
Không sử dụng các mua sắm đã lưu trữ nếu bạn thực sự muốn viết một hệ thống đặt trước thực sự, nó làm mất đi mục đích của việc có cơ sở dữ liệu.
Ngoài ra, viết ra các ngày như thế này là 2007-04-29 thực sự là một cách tuyệt vời vì không phải mọi ngày đều đến từ cùng một nơi và đây là tiêu chuẩn quốc tế. Cũng lưu ý, nếu bạn biến nó thành một chuỗi, nó sẽ vẫn được sắp xếp chính xác!
Bạn cần tạo một bảng calandar vì MySQL không có sẵn các hàm để thực hiện việc đó. Quy trình này sẽ tính toán ngày tháng cho bạn.
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');
from: 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
Tôi sẽ bỏ qua những ngày bạn đã đưa ra trong câu hỏi của mình và giả sử rằng khách hàng không quay ngược thời gian.
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
Và, như bạn có thể thấy sql khá ngắn gọn và dễ đọc mà không cần dùng đến các hàm hoặc thủ tục. Điều này sẽ có thể mở rộng quy mô phù hợp và xử lý các câu hỏi phức tạp hơn. Ngoài ra, nó cho phép kiểm tra tham chiếu được sử dụng vì dữ liệu dựa trên bảng.