【问题标题】:Hotel Booking Rates SQL Problem酒店预订率 SQL 问题
【发布时间】:2011-03-27 21:59:23
【问题描述】:

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

当预订日期的费率没有重叠时,我的查询工作正常,并产生正确的天数,但何时重叠,我的第二行结果会多出一天。

例如,一个人于 2011 年 4 月 14 日到达并于 2011 年 4 月 16 日离开(2 天)。 15号有66到70的汇率变化,所以他应该有1天的66汇率和1天的70汇率。

我尝试过不使用 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

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

谢谢

【问题讨论】:

    标签: mysql sql database date


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      如果我正确理解您的算法,您希望甚至部分包含第一天,所以我建议您使用而不是 +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)
      

      【讨论】:

        【解决方案3】:

        感谢您的回答,Martin 您制作了 2 行但没有几天...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
        

        再次感谢您的帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-10
          • 2020-06-09
          • 1970-01-01
          相关资源
          最近更新 更多