不同季节的酒店房间价格

use*_*900 2 mysql vb6 date range

我有一个数据库(MySQL),其中包含一个包含日期范围(作为startdate和enddate)和rate字段的表.日期范围意味着不同的季节(低,高等).这种情况是一个人在酒店办理入住手续,他的逗留时间是两个季节.示例数据如下所示:

SeasonName         SartDate            EndDate           Rate
Low                01-01-2007          30-04-2007        100.00
High               01-05-2007          31-08-2007        150.00
Peak               01-09-2007          31-12-2007        200.00
Run Code Online (Sandbox Code Playgroud)

客户的入住日期为29-04-2007,退房日期为03-05-2007.我需要计算每个季节的确切夜数,并计算总金额.

IDE是VB6.任何帮助将非常感激.

谢谢

汤姆

谢谢你的回复.我需要SQL来提取信息.至于日期有效期,我们假设费率适用于午夜(00:00).希望我澄清一下.

汤姆

nat*_*e c 8

在酒店工作并编写了预订系统,就计费而言,每小时时间是无关紧要的.一切都是晚上充电.(除非您打算经营一个按小时收费的地方!;-))办理登机手续和退房手续是运营方面的考虑因素.

如果您真的想要编写真实的预订系统,请不要使用存储过程.它违背了建立数据库的目的.

另外,写出这样的日期是2007-04-29真的很棒,因为不是每个人都来自同一个地方,这是一个国际标准.另请注意,如果您将其转换为字符串,它仍将正确排序!

你需要制作一个calandar表,因为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');
Run Code Online (Sandbox Code Playgroud)

来自: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
Run Code Online (Sandbox Code Playgroud)

我将忽略你在问题中给出的日期,并假设客户没有及时倒退.

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
Run Code Online (Sandbox Code Playgroud)

并且,正如您所看到的,sql非常简洁和可读,无需借助函数或过程.这将能够正确扩展并处理更复杂的问题.此外,它使得能够使用参考检查,因为数据是基于表的.