Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Giá phòng khách sạn cho các mùa khác nhau

Đã 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySql.Data.MySqlClient.Replication.ReplicationManager ném một System.TypeInitializationException

  2. Tham gia vào cùng một bàn nhiều hơn một lần

  3. Quay lại những ngày không có cuối tuần

  4. Cài đặt mysql trên leopard:Không thể kết nối với máy chủ MySQL cục bộ thông qua socket

  5. Gặp sự cố với các hàng khớp trong cơ sở dữ liệu bằng cách sử dụng PDO