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