2015-12-03 91 views
2

我有一個包含重疊預訂日期的臨時表。這些日期可以以任意組合方式重疊,因爲它們適用於多個可用房間。具有重疊日期跨度的MySQL合併表記錄

我想創建一個查詢,返回一組合並的日期。 (結帳日期是可用天)。

例如,下面的數據

+--------+-------------+------------+------------+ 
| id  | rental_unit | checkin | checkout | 
+--------+-------------+------------+------------+ 
| 9144 |   224 | 2015-11-04 | 2015-12-27 | 
| 352580 |   341 | 2015-12-01 | 2016-02-06 | 
| 7519 |   224 | 2015-12-27 | 2016-01-05 | 
| 9141 |   224 | 2016-01-05 | 2016-02-04 | 
| 13834 |   341 | 2016-01-16 | 2016-01-23 | 
| 9142 |   224 | 2016-02-05 | 2016-03-04 | 
| 352581 |   341 | 2016-02-07 | 2016-03-12 | 
| 11707 |   341 | 2016-02-22 | 2016-03-12 | 
| 11239 |   224 | 2016-03-11 | 2016-03-19 | 
| 11889 |   224 | 2016-03-20 | 2016-04-03 | 
| 352582 |   341 | 2016-03-27 | 2016-04-07 | 
+--------+-------------+------------+------------+ 

將返回:

+------------+------------+ 
| checkin | checkout | 
+------------+------------+ 
| 2015-11-04 | 2016-03-19 | 
| 2016-03-20 | 2016-04-07 | 
+------------+------------+ 

謝謝!

回答

1

這兩個內部查詢確定每組日期範圍的簽入和簽出日期(上面的示例數據集中有2個)。我將這兩組日期連接在一起,外部查詢獲取所需的簽入/簽出日期組合。

SELECT t2.checkin, MIN(t1.checkout) FROM 
(
    SELECT b1.checkout AS checkout 
    FROM bookings b1 INNER JOIN bookings b2 ON b1.checkout BETWEEN b2.checkin AND b2.checkout 
    GROUP BY b1.checkout 
    HAVING COUNT(*) = 1 
) t1 
INNER JOIN 
(
    SELECT b1.checkin AS checkin 
    FROM bookings b1 INNER JOIN bookings b2 ON b1.checkin BETWEEN b2.checkin AND b2.checkout 
    GROUP BY b1.checkout 
    HAVING COUNT(*) = 1 
) t2 
ON t2.checkin < t1.checkout 
GROUP BY t2.checkin 

點擊下面的鏈接,運行演示:

SQLFiddle

+0

@MarkGoldberg請務必測試所有邊緣的情況下生產。如果有任何怪癖,請回到這裏。現在,我的查詢看起來是正確的。 –

+0

我有一個重疊的開放日期跨度類似的表,並且此查詢不按預期方式工作。我不完全理解這個問題,所以我確信問題出在哪裏。希望我能更好地理解這一點,因爲我不知道這是一個「邊緣」情況還是僅僅處理這種表格的方式有所不同,因爲「打開」是「打開」的「打開」和「關閉」的細微差別可用日期和「關閉」是不可用的日期「 - 這與」登入「和」結帳「的操作方式相反 –

+0

問題也可能與您的數據在另一個表中的結構方式有關。這個數據的新問題,然後ping我?SQL查詢通常不是一個尺寸。 –

相關問題