酒店预订率SQL问题

时间:2011-03-27 21:59:24

标签: mysql sql database date

您好我在StackOverflow上阅读其他问题之后,一直在尝试使用我自己的系统检查房价。

我的查询工作正常并且在预订日期中没有重叠费率时生成正确的天数但是当重叠时我在第二行结果上获得额外的一天。

例如,一个人到达2011-04-14并离开2011-04-16(2天)。 15日的汇率从66变为70,因此他应该在66的汇率下1天,在70汇率时1天。

我尝试过没有TIMEDATE - 只是DATE,但同样的事情发生了。

查询

    SELECT rates.rate_id, rate_start_date, rate_end_date, rate_price, 
(DATEDIFF( IF (rate_end_date > '2011-04-16 14:00:00' , '2011-04-16 14:00:00', rate_end_date),
IF ( rate_start_date < '2011-04-14 12:00:00' , '2011-04-14 12:00:00' , rate_start_date )) +1 ) 
AS days FROM rates 
WHERE rate_start_date <= '2011-04-16 14:00:00' AND rate_end_date > '2011-04-14 12:00:00' 
ORDER BY rate_price ASC

费率表

rate_id rate     rate_start_date        rate_end_date
1       70      2011-04-15 00:00:00   2011-05-31 23:59:59
2       80      2011-06-01 00:00:00   2011-06-30 23:59:59
3      100      2011-07-01 00:00:00   2011-08-31 23:59:59
4       80      2011-09-01 00:00:00   2011-09-30 23:59:59
5       70      2011-10-01 00:00:00   2011-10-31 23:59:59
6       45      2011-11-01 00:00:00   2011-12-31 23:59:59
0       66      2011-01-01 00:00:00   2011-04-14 23:59:59

结果

rate_id  rate_start_date         rate_end_date       rate    days
0       2011-01-01 00:00:00    2011-04-14 23:59:59  66  1
1       2011-04-15 00:00:00    2011-05-31 23:59:59  70  2 <----this should be 1 day

我真的很感激任何帮助或解释为什么我的查询给了我第二行结果的额外一天。

由于

3 个答案:

答案 0 :(得分:0)

2011-04-16 16:00和2011-04-15 00:00之间有一天16个小时,因此DATEDIFF(...)+1正在返回(正确)1 + 1天。

这里的问题是客人到达/离开的时间(中午左右)与费率变化的时间(午夜)之间的不匹配。

您必须检查您的要求,但可能您可以忽略最后一个部分日,并让客人在2011-04-15 23:59:59“离开”进行费率计算。以同样的方式,让客人“到达”2011-04-14 00:00:00。第一天的额外时间将弥补最后一天的失踪时间。

答案 1 :(得分:0)

如果我正确理解你的算法,你想要包括第一天甚至部分,所以我建议你使用而不是+ 1为每个速率只为第一个这样做。

尝试使用它(MSSQL):

+ CASE WHEN rate_start_date <= '2011-04-14 12:00:00' THEN 1 ELSE 0 end

或(MYSQL):

+ IF (rate_start_date <= '2011-04-14 12:00:00', 1 ,0)

答案 2 :(得分:0)

感谢你的回答,马丁你生产了两排但没有几天... Emilio你的回答让我思考我是如何设定费率的。我将费率表更改为日期格式而不是日期时间,并使rate_end_date与下一个rate_start_date相同。

0   66  2011-01-01  2011-04-15
1   70  2011-04-15  2011-06-01
2   80  2011-06-01  2011-07-01
3   100 2011-07-01  2011-09-01
4   80  2011-09-01  2011-10-01
5   70  2011-10-01  2011-11-01
6   45  2011-11-01  2012-01-01

然后放弃+1和

SELECT rates.rate_id, rate_start_date, rate_end_date, rate_price, 
(DATEDIFF( IF (rate_end_date > '2011-04-16' , '2011-04-16', rate_end_date), 
IF ( rate_start_date < '2011-04-14' , '2011-04-14' , rate_start_date )) ) 
AS days FROM rates WHERE rate_start_date <= '2011-04-16' 
AND rate_end_date > '2011-04-14' 
ORDER BY rate_price ASC

产生

rate_id   rate_start_date   rate_end_date   rate  days    
    0   2011-01-01  2011-04-15  66  1
    1   2011-04-15  2011-06-01  70  1

以及4月1日至8日没有重叠率的查询:

SELECT rates.rate_id, rate_start_date, rate_end_date, rate_price, 
(DATEDIFF( IF (rate_end_date > '2011-04-08' , '2011-04-08', rate_end_date), 
IF ( rate_start_date < '2011-04-01' , '2011-04-01' , rate_start_date )) ) 
AS days FROM rates WHERE rate_start_date <= '2011-04-08' 
AND rate_end_date > '2011-04-01' 
ORDER BY rate_price ASC

产生

rate_id   rate_start_date    rate_end_date   rate  days
    0     2011-01-01       2011-04-15     66    7

感谢agiain的帮助!