2017-04-17 145 views
3

我有以下表格:选择日期范围和列之间的日期

让我们假设第一个表格表示客户为酒店进行的预订。

+------------+-----------+-----------+--------------+----------------+ 
| booking_id | client_id | room_type | arrival_date | departure_date | 
+------------+-----------+-----------+--------------+----------------+ 
|   1 |   1 |   1 | 2016-05-30 | 2016-06-03  | 
+------------+-----------+-----------+--------------+----------------+ 

第二张表包含不同类型房间的价格。价格在不同的时间段有所不同。

+---------------+-----------+------------+------------+-------+ 
| room_price_id | room_type | start_date | end_date | price | 
+---------------+-----------+------------+------------+-------+ 
|    1 |   1 | 2016-03-01 | 2016-05-31 | 150 | 
|    2 |   1 | 2016-06-01 | 2016-08-31 | 200 | 
+---------------+-----------+------------+------------+-------+ 

我的问题是:如果价格在整个预订期间价格不一样,我怎样才能计算预订的总费用? (在我的情况下,总成本将为700)

我阅读以下链接:MySQL: Select all dates between date range and get table data matching datesSelect data from date range between two dates,但我不明白如何解决我的问题,因为表中的条目仅包含日期范围和不明确的日期,如在第一个链接。

+1

我认为总价应该是'900',不是? –

回答

4

与您的问题的技巧是在制定bookingprices表之间的连接条件。一旦这样做,一个简单的聚合就可以得到你想要的结果。只要给定价格范围内的任何点落入到达或离开日期的范围内,连接条件就应该为真。

然后,数天里,我们使用抵达日期或起始日期的更大和离港日期或结束日期的较小

SELECT 
    b.booking_id, 
    SUM((DATEDIFF(LEAST(b.departure_date, p.end_date), 
      GREATEST(b.arrival_date, p.start_date)) + 1) * p.price) AS total 
FROM booking b 
INNER JOIN prices p 
    ON b.room_type = p.room_type AND 
     (p.start_date BETWEEN b.arrival_date AND b.departure_date OR 
     p.end_date BETWEEN b.arrival_date AND b.departure_date) 
GROUP BY b.booking_id; 

输出为您的样本数据是900。这是正确的,因为:

2 days x 150 = 300 
3 days x 200 = 600 
     total = 900 

演示在这里:

SQLFiddle

而且here is another demo其中突出的情况下一个留下重叠整个价格范围。