嗨所有专家都在那里。我在这里有一个大问题,我仍在努力寻找解决方案。 我有一个预订系统,它只显示酒店房价。一旦客户要求房间,我们通过联系酒店手动检查可用性。所以可用性部分我们不想实现没有网站。然而,费率系统有一点问题。例如,如果我搜索从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
这意味着根据我的搜索要求,花园别墅价格没有完全完成。所以我不应该显示花园别墅价格。我希望那里的所有天才人都会考虑找到解决这个问题的方法。
答案 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 三周的思想工作终于解决了