Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Tarif Kamar Hotel untuk musim yang berbeda

Setelah bekerja di hotel dan menulis sistem reservasi, waktu per jam tidak relevan sejauh penagihan. Semuanya selalu dibebankan pada malam hari. (Kecuali Anda berencana menjalankan tempat yang mengenakan biaya per jam!;-)) Check-in dan check-out adalah pertimbangan operasional.

Jangan gunakan prosedur yang tersimpan jika Anda benar-benar ingin menulis sistem reservasi yang sebenarnya. Ini menggagalkan tujuan memiliki database.

Juga, menulis tanggal seperti ini adalah 2007-04-29 adalah cara yang bagus karena tidak semua orang berasal dari tempat yang sama dan ini adalah standar internasional. Perhatikan juga, jika Anda mengubahnya menjadi string, ini akan tetap diurutkan dengan benar!

Anda perlu membuat tabel kalender karena MySQL tidak memiliki fungsi bawaan untuk melakukannya. Prosedur ini akan membuat tanggal untuk Anda.

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');

dari: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

Saya akan mengabaikan tanggal yang Anda berikan dalam pertanyaan Anda dan menganggap klien tidak berjalan mundur dalam waktu.

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

Dan, seperti yang Anda lihat, sql cukup ringkas dan mudah dibaca tanpa menggunakan fungsi atau prosedur. Ini akan dapat mengukur dengan benar dan menangani pertanyaan yang lebih kompleks. Selain itu, ini memungkinkan pemeriksaan referensial untuk digunakan karena datanya berbasis tabel.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menyimpan karakter UTF8 di MySQL

  2. Panduan Merancang Database Untuk Sistem Manajemen Karyawan Di MySQL

  3. Kembalikan transaksi Mysql pada kegagalan dalam pembaruan

  4. Kode Kesalahan:1822. Gagal menambahkan batasan kunci asing. Tidak ada indeks untuk kendala

  5. Mengeluarkan semua kesalahan PHP ke database bukan error_log