sql >> データベース >  >> RDS >> Mysql

さまざまな季節のホテルの宿泊料金

    ホテルで働いて予約システムを作成したので、請求が行われる限り、1時間ごとの時間は関係ありません。すべては常に夜に課金されます。 (時間単位で課金される場所を運営する予定がない限り!;-))チェックインとチェックアウトは運用上の考慮事項です。

    実際に実際の予約システムを作成したい場合は、保存された手順を使用しないでください。データベースを持つという目的が損なわれます。

    また、このように日付を書き出すのは2007-04-29です。すべてが同じ場所から来ているわけではなく、これは国際標準であるためです。また、これを文字列に変換した場合でも、正しく並べ替えられることに注意してください。

    MySQLにはそれを行うための組み込み関数がないため、カレンダーテーブルを作成する必要があります。この手順により、日付が作成されます。

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

    差出人: 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
    

    私はあなたがあなたの質問で与えた日付を無視し、クライアントが時間的に逆行していないと仮定します。

    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
    

    また、ご覧のとおり、SQLは非常に簡潔で、関数やプロシージャに頼ることなく読みやすくなっています。これにより、適切にスケーリングし、より複雑な質問を処理できるようになります。また、データはテーブルベースであるため、参照チェックを使用できます。



    1. MySQLに最適なvarcharサイズは何ですか?

    2. 名前列からスラッグ名列を生成する簡単な方法は?

    3. PHP+MySQLを使用したutf-8エンコーディングの問題

    4. ORDERBYフィールドを選択せず​​にDISTINCT行を選択する方法