2011-03-27 70 views
1

嗨我一直试图让我自己的系统检查房间价格后阅读其他问题在这里StackOverflow。酒店预订价格SQL问题

我的查询工作正常,生产的天正确的号码时,没有在预订日期没有打分的重叠,但如果是重叠我得到我的结果的第二行额外的一天。

例如,一个人到达在2011-04-14和叶2011-04-16(2天)。 15日的汇率变化从66到70,所以他应该有66天的利率1天和70天的利率1天。

我曾尝试没有TIMEDATE - 只是日期,但同样的事情发生。

查询

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 

我真的很感激任何帮助或为什么我的查询给了我第二次的额外的一天一个交代一排结果。

感谢

回答

0

谢谢您的回答,您马丁生产的2行,但无天...埃米利奥你的答案让我想起我是如何设定费率的。我将费率表更改为日期格式而不是日期时间,并将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月8日的查询从1:

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的帮助!

0

之间2011-04-16 16:00和00:00 2011-04-15有一天16个小时,因此您的DATEDIFF(...)+1正在恢复(正常)1 + 1天。

这里的问题是,时间当客人到达/离开(中午左右)的时间之间的不匹配时,速度改变(在午夜)。

你必须检查你的要求,但可能你可以不理会最后部分的一天,并有率计算的目的来宾“假”在2011-04-15 23:59:59。以同样的方式,客人在2011-04-14 00:00:00“到达”。第一天的额外时间将补偿在最后一天错过的时间。

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)