我有兩個數據庫表,一個存儲屬性,另一個存儲屬性的預約。下面是表結構的簡化版本:SQL'Check Availability'語句
property
+-------------------+--------------+
| Field | Type |
+-------------------+--------------+
| id | int(11) |
| status | int(1) |
| title | varchar(150) |
+-------------------+--------------+
booking
+-------------------+--------------+
| Field | Type |
+-------------------+--------------+
| id | int(11) |
| status | int(1) |
| property_id | int(11) |
| start_date | date |
| end_date | date |
+-------------------+--------------+
我有一個開始和結束日期搜索表單,看看有什麼特性在一定時期內可供選擇。例如「在2012年12月1日至2012年12月7日之間有哪些房產可供租賃」。
我有以下SQL其效果是有限的:
SELECT p.id, p.title FROM property p WHERE p.status=1 AND p.id NOT IN (SELECT
b.property_id FROM booking b WHERE (b.status=1 OR b.status=2 OR b.status=3 OR
b.status=6) AND NOT (b.enddate < '2013-05-30' OR b.startdate > '2013-05-24'))
ORDER BY p.title ASC
的問題是,它不處理的日期重疊。如果搜索是針對現有預訂中的日期範圍,則SQL工作正常,並且不會返回該屬性。但是,如果搜索日期與預訂日期重疊,則即使屬性在搜索期間的一部分被預訂,屬性仍會返回。
我在這裏安裝了一個SQL小提琴:http://sqlfiddle.com/#!2/d02e1/4 - 有5個查詢 - 前2個工作正常。是我需要返回的性質如下:
- 查詢1(工作) - 1,2和3
- 查詢2(工作) - 2和3
- 查詢3(不工作) - 2和3
- 查詢4(不工作) - 2和3
- 查詢5(不工作) - 2和3
任何幫助或建議是非常讚賞。
UPDATE;
我想我的措辭可能有點不清楚。我想要做的是獲取可用於租賃的特定日期範圍(搜索日期)的屬性列表。如果有財產將不可用;搜索日期在現有預訂日期範圍內,或者在任一端重疊。如果沒有涵蓋任何搜索日期之間的預訂,則該酒店可用。
這幾乎得到了它,但現在如果你有搜索在現有預訂日期範圍內的日期,該屬性在它不應該出現時出現(即屬性1不應出現在本示例中的任何查詢中:http://sqlfiddle.com/#!2/d02e1/45) – gbuckingham89
我認爲我的措辭可能有點不清楚。我想要做的是獲取可用於租賃的特定日期範圍(搜索日期)的屬性列表。如果有財產將不可用;搜索日期在現有預訂日期範圍內,或者在任一端重疊。如果沒有涵蓋任何搜索日期之間的預訂,則該酒店可用。 – gbuckingham89