mysql公寓预订的季节性价格

时间:2014-05-29 06:40:40

标签: mysql

我正在公寓租赁网站上工作,公司有自己的帐户,可以上传房产。 我坚持季节性定价实施。每个房产在一年中的不同时段可能会有不同的房价。 我有以下表格:

物体

    drop table if exists objects;

    create table objects (
    id bigint unsigned not null primary key
    );

    insert into objects values('1200');
    insert into objects values('1201');
    insert into objects values('1202');
    insert into objects values('1203');

    drop table if exists rates;
    create table rates
    (
        id serial,
        obj_id_sys bigint unsigned not null,
        season          varchar(100),
        start_date      date            references calendar(date_),
        end_date        date            references calendar(date_),
        rate            float
    );
    insert into rates values ('', '1203', 'default',    '0000-00-00',   '0000-00-00',   75.00);
    insert into rates values ('', '1203', 'Low',    '2014-06-01',   '2014-06-30',   100.00);
    insert into rates values ('', '1203', 'High',   '2014-07-01',   '2014-07-30',   150.00);
    insert into rates values ('', '1203', 'Peak',   '2014-09-01',   '2014-09-30',   200.00);

    insert into rates values ('', '1202', 'default',    '0000-00-00',   '0000-00-00',   85.00);
    insert into rates values ('', '1202', 'June',    '2014-06-01',   '2014-06-30',   75.00);
    insert into rates values ('', '1202', 'July',   '2014-07-01',   '2014-07-30',   90.00);
    insert into rates values ('', '1202', 'September',   '2014-09-01',   '2014-09-30',           105.00);

    insert into rates values ('', '1201', 'default',    '0000-00-00',   '0000-00-00',   92.00);
    insert into rates values ('', '1201', 'Low',    '2014-06-01',   '2014-07-15',   80.00);
    insert into rates values ('', '1201', 'High',   '2014-07-01',   '2014-08-30',   88.00);
    insert into rates values ('', '1201', 'Peak',   '2014-09-01',   '2014-09-30',   95.00);

    insert into rates values ('', '1200', 'default',    '0000-00-00',   '0000-00-00',   92.00);
    insert into rates values ('', '1200', 'Low',    '2014-06-01',   '2014-06-30',   80.00);
    insert into rates values ('', '1200', 'High',   '2014-07-01',   '2014-08-1',   88.00);
    insert into rates values ('', '1200', 'Peak',   '2014-09-01',   '2014-09-30',   95.00);

属性信息保存在对象表中。

费率表中 obj_id_sys 字段中的值对应对象中的 id

我希望以任意用户定义的时间段返回其费率的对象,比如2014-07-01 - 2014-08-20。

如果预订期限不符合任何季节性价格,则应使用“默认”季节价格。

我正在使用包含所有可能日期的帮助表日历

    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 ;

    drop table if exists calendar;
    create table calendar 
    ( 
        date_       date        primary key
    );

    call fill_calendar('2014-1-1', '2020-12-31');

以下查询几乎返回我想要的内容,除非为每个日期返回默认费率,即使季节性价格可用于该日期,导致日期在一个季节内的日期价格:其中一个季节和默认季节。

    select
        coalesce(objects.id, r.obj_id_sys) as id,
        calendar.date_ as date_,
        r.season as season,
            r.rate as amount
            from calendar
                LEFT OUTER JOIN rates AS r
                on (calendar.date_ >= r.start_date and calendar.date_ <= r.end_date) or r.season='default'
            JOIN objects 
                    on objects.id = r.obj_id_sys
        WHERE calendar.date_ between '2014-07-29' and '2014-08-3'
    order by id, date_
        ;   

如何仅针对没有季节性价格的日期返回默认费率?因此,每个对象对于一个日期只有一个速率,我只是在末尾执行SUM(速率)和GROUP BY id来获取对象ID和总价。

此外,某些属性仅在表费率中指定的季节内可用。如果预订时间超出预订期限,则不得退还该酒店。有没有办法在一个查询中完成所有这些?

修改 此方法基于以下帖子:Hotel Room Rates for different seasons

编辑2 也许最好不要对属性使用单个“默认”行,而是填充缺少范围的日期范围表并使它们成为“默认”。但这是另一个问题。我在这里发布了: How to find missing date ranges?

0 个答案:

没有答案