2017-04-17 146 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其中突出的情況下一個留下重疊整個價格範圍。