2014-09-02 100 views
0

再次預訂系統和日期範圍。 我讀過這個話題Comparing date ranges和許多人一樣, 卻找不到答案:(預訂日期範圍mysql php

請參閱SQLFiddle http://sqlfiddle.com/#!2/89b2b/2

我已經預訂表,具有類型的IDObjectIDPeriodStartPeriodEnd領域DATEMySQL
我的示例數據如下:

(1, 3, '2014-08-07', '2014-08-14'), 
(2, 3, '2014-08-19', '2014-08-23'), 
(3, 2, '2014-08-13', '2014-08-15'), 
(4, 2, '2014-08-19', '2014-08-21'); 

我查詢日期間隔(更新,是$from = '2014-08-14';):

$from = '2014-08-15'; 
$to = '2014-08-19' 

我想獲得ObjectID S中的上查詢免費日期間隔。
問題是,對象的2首先保留在2014-08-15結束,我們想要從2014-08-15開始新的保留。同樣的事情結束日期2014-08-19。現有的預訂在這一天開始。 humans沒問題,因爲我們計算日期爲nights,但是如何將同樣的事情告訴MySQL

對於這些變量

$from = '2014-08-15'; 
$to = '2014-08-19' 

我想獲得[2, 3]作爲查詢的結果。

對於第二個查詢

$from = '2014-08-14'; 
$to = '2014-08-19' 

我想只有[3]得到作爲查詢的結果,因爲對象ID 213 aug預訂到15 aug

+0

'WHERE PeriodStart <= '2014年8月19日' 和PeriodEnd> =「2014-08-14'':難道我誤解了你的問題或者你是否反轉periodStart和periodEnd? – Logar 2014-09-02 12:23:09

+0

爲什麼'2'會出現在結果中? – 2014-09-02 12:33:42

+0

@GordonLinoff好點。我的錯。 :( – Lari13 2014-09-02 12:41:09

回答

2

完整的代碼是:

SELECT DISTINCT ObjectID 
FROM booking 
WHERE ObjectID IN 
(
SELECT ObjectID 
FROM booking 
WHERE PeriodStart <= '2014-08-19' AND PeriodEnd >= '2014-08-14' 
) 

+----------+ 
| OBJECTID | 
+----------+ 
|  2 | 
|  3 | 
+----------+ 

小提琴:http://sqlfiddle.com/#!2/89b2b/90

+0

感謝@GordonLinoff,他發現了錯誤。如果對象2在數據庫預訂時間爲13至15年8月,您的查詢如何正確回答? 我編輯了問題並更改了查詢週期 – Lari13 2014-09-02 12:45:32

+0

您希望第13到第15或第15到第19 ? – 2014-09-02 13:19:12

+0

我想在任何輸入的時間間隔內得到正確的結果。查詢'14-19 aug'必須只有一個結果'3',查詢'15-19 aug'必須是兩個結果'[2,3]' – Lari13 2014-09-02 13:25:32

0

你一定的情況下結束日期是不包括在內。我想表達的查詢爲:

select b.objectid 
from booking b 
group by b.objectid 
having sum(b.PeriodStart < '2014-08-19' and B.PeriodEnd > '2014-08-14') = 0 

這計數的次數是有一個預訂,涵蓋你關心的夜。如果有,則該對象被過濾掉。

+0

有沒有原因downvote上什麼似乎是工作邏輯?(http://sqlfiddle.com/#!2/89b2b/14) – 2014-09-02 12:24:18

+0

你的查詢在我看來是好的,或者我真的不明白你想要什麼,他說他想要對象2 ,在結果3,但對象2有一個預訂在2014年8月14日,所以.. – Logar 2014-09-02 12:32:03

+0

@Logar謝謝。我的錯誤。我想查詢日期'14-19 Aug'唯一ObjectID ** 3 **,併爲查詢'15-19 Aug' both'[2,3]'。 我已經更新了這個問題。對不起,錯誤:( – Lari13 2014-09-02 12:47:44

0

這也似乎工作?我在問題缺少什麼

SELECT DISTINCT(ObjectID) 
FROM booking 
WHERE PeriodStart <= '2014-08-19' AND PeriodEnd >= '2014-08-14' 
+0

哦,對不起,你已經忽略了你的答案 - 但是請注意DISTINCT不是一個函數! – Strawberry 2014-09-02 12:24:52

0
SELECT DISTINCT ObjectID 
    FROM booking 
WHERE PeriodStart <= '2014-08-19' 
    AND PeriodEnd >= '2014-08-14'; 

http://sqlfiddle.com/#!2/89b2b/15

+0

Thanks for答案,但提供數據提供您的查詢返回錯誤r esult。我們已經爲從'13 aug'到'15 aug'預訂的對象'2'進行了預訂。請參閱最新的問題。 – Lari13 2014-09-02 19:50:04

+0

這不會返回2和3?現在我很困惑。也許你需要一個更具代表性的數據集和所需的結果集。 – Strawberry 2014-09-02 22:43:43