sql >> Databasteknik >  >> RDS >> Mysql

Hotellrumspriser för olika säsonger

Efter att ha arbetat på ett hotell och skrivit bokningssystemet är timtid irrelevant när det gäller fakturering. Allt laddas alltid på natten. (Om du inte planerar att driva ett ställe som tar betalt per timme!;-)) Incheckning och utcheckning är operativa överväganden.

Använd inte lagrade procedurer om du verkligen vill skriva ett riktigt bokningssystem. Det motverkar syftet med att ha en databas.

Att skriva ut datum som detta är 2007-04-29 är också ett riktigt bra sätt eftersom inte alla är från samma plats och detta är en internationell standard. Lägg också märke till att om du skulle förvandla detta till en sträng kommer den fortfarande att sorteras korrekt!

Du måste skapa en kalendertabell eftersom MySQL inte har inbyggda funktioner för att göra det. Denna procedur kommer att bygga upp datum åt dig.

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

från: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

Jag kommer att ignorera datumen du har angett i din fråga och anta att klienten inte reser bakåt i tiden.

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

Och som du kan se är sql ganska kortfattad och läsbar utan att tillgripa funktioner eller procedurer. Detta kommer att kunna skala ordentligt och hantera mer komplexa frågor. Det gör det också möjligt att använda referenskontroll eftersom data är tabellbaserad.



  1. Grupperad aggregerad pushdown

  2. Automatisk radering av processer som har fastnat i MS SQL Server

  3. Hur mycket RAM-minne behöver din nya databasserver?

  4. Hur man aktiverar Change Data Capture (CDC) på en databas i SQL Server - SQL Server Tutorial