Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Ceny pokoi hotelowych dla różnych pór roku

Po przepracowaniu w hotelu i napisaniu systemu rezerwacji godzinowy czas nie ma znaczenia przy rozliczeniu. Wszystko jest zawsze ładowane w nocy. (Chyba, że ​​planujesz prowadzić lokal, który pobiera opłaty godzinowe!;-)) Zameldowanie i wymeldowanie to względy operacyjne.

Nie używaj przechowywanych procedur, jeśli rzeczywiście chcesz napisać prawdziwy system rezerwacji. Jest to sprzeczne z celem posiadania bazy danych.

Poza tym zapisywanie dat takich jak ta 2007-04-29 jest naprawdę świetnym sposobem, ponieważ nie każdy pochodzi z tego samego miejsca i jest to międzynarodowy standard. Zauważ również, że jeśli chcesz to zamienić w ciąg, nadal będzie on posortowany poprawnie!

Musisz utworzyć tabelę kalendarza, ponieważ MySQL nie ma wbudowanych funkcji, aby to zrobić. Ta procedura zbuduje dla Ciebie daty.

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

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

Zignoruję daty podane w pytaniu i założę, że klient nie cofa się w czasie.

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

Jak widać sql jest dość zwięzły i czytelny bez uciekania się do funkcji czy procedur. Będzie w stanie odpowiednio skalować i obsługiwać bardziej złożone pytania. Ponadto umożliwia użycie sprawdzania referencji, ponieważ dane są oparte na tabeli.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MyISAM kontra InnoDB

  2. Znajdź wolny pokój (system rezerwacji)

  3. Jak wykonać modelowanie dziedziczenia w relacyjnych bazach danych?

  4. Jak zainstalować pakiet MySQLdb? (ImportError:brak modułu o nazwie setuptools)

  5. Nie mogę zainstalować mysql2 gem na macOS Sierra