房价回归,结果正确,结果错误

时间:2014-01-18 08:32:32

标签: mysql

嗨所有专家都在那里。我在这里有一个大问题,我仍在努力寻找解决方案。 我有一个预订系统,它只显示酒店房价。一旦客户要求房间,我们通过联系酒店手动检查可用性。所以可用性部分我们不想实现没有网站。然而,费率系统有一点问题。例如,如果我搜索从2014-02-27到2014-03-02的房价,这是两个日期范围,我得到两个结果,其中一个结果没有完全完成。 这是我的数据库

    room id    room_name    rate_starts   rate_ends    single_room   double_room
    1          standard     2014-01-01    2014-02-28   150           200
    1          standard     2014-03-01    2014-03-05   200           250
    1          standard     2014-03-06    2014-03-31   300           350
    2          Garden Villa 2014-01-01    2014-02-28   300           400

这是我的查询

     SELECT room_id, room_name, 
     SUM(`single_room` * DateDiff(
      Least(rate_ends + INTERVAL 1 DAY, '$ends'),
      Greatest(rate_starts, '$starts')
     )) AS Total
     FROM
     room_rate
     WHERE
      hotel_id   = '$hotel_id' AND
      rate_ends >= '$starts' AND
      rate_starts <= '$ends'              
      GROUP BY room_id

这是我的结果

    Standard room 500
    Garden Villa 600

我期待这个答案         标准间500

这里有一个关于我的真实情况的一点解释。我的搜索是从2014-02-27到2014-03-02,它在数据库中属于两个日期范围。         标准房(150×02 = 300 + 200×01 = 200)= 500         花园别墅(300 X 02 = 600 +此日期范围未在DB中提供)= 600

这意味着根据我的搜索要求,花园别墅价格没有完全完成。所以我不应该显示花园别墅价格。我希望那里的所有天才人都会考虑找到解决这个问题的方法。

2 个答案:

答案 0 :(得分:0)

在sql查询中使用having子句来过滤掉天数错误的结果

类似

having sum(DateDiff(
     Least(rate_ends + INTERVAL 1 DAY, '$ends'),
      Greatest(rate_starts, '$starts')
     )) = datediff('$ends', '$starts')

答案 1 :(得分:0)

    SELECT room_id, room_name, 
    SUM(single_room * DateDiff(
    Least(rate_ends + INTERVAL 1 DAY, '$ends'),
    Greatest(rate_starts, '$starts')
    )) AS Total, 
    sum(DateDiff(
    Least(rate_ends + INTERVAL 1 DAY, '$ends'),
    Greatest(rate_starts, '$starts')
    )) as num_days
    FROM
   room_rate 
   WHERE
   rate_ends >= '$starts' AND
   rate_starts <= '$ends' 
   GROUP BY 
   room_id
   having 
   sum(DateDiff(
   Least(rate_ends + INTERVAL 1 DAY, '$ends'),
   Greatest(rate_starts, '$starts')
   )) = datediff('$ends', '$starts')

这个答案很好,所有感谢@ user1455836 三周的思想工作终于解决了