2009-09-22 218 views
0

我的查詢有問題。它給了我在某些情況下的正確結果,而對於某些情況,它給了我正確的結果,所以如果有人能告訴我要改變什麼,那將是驚人的,因爲我現在已經堅持了一段時間。這裏是我的表中的數據:MySQL查詢日期比較

表reservation_logs:

log_id  int(15) auto_increment Primary Unique 
room_log int(10)   
dt_from  date     
dt_until date    

表公寓:

apartman_id  int(10) auto_increment Primary Unique 
apartman_name int(10) 

我的日期PHP代碼:

$date_from = 'text input date'; 
$date_until = 'text input date'; 

$myquery = ("SELECT * FROM reservation_logs WHERE room_log = '$apartman_id' 
AND(((dt_from >= '$date_from' AND dt_from <= '$date_until') 
AND (dt_until >= '$date_until' OR dt_until <= '$date_until')))"); 

現在我輸入一些日期我應該得到正確apartman_id,如果它忙或不。以下是這種情況:當$date_from等於當月的第一天,$date_until等於一個月中的最後一天。但是,例如,如果我選擇的日期爲$date_from等於該月的第16個月,而$date_until等於該月的第17個月,如果從第15個月的第15個月到第19個可以說的空間繁忙,我會得到不正確的結果。我希望我不會讓更多的人想到背後的想法太複雜了。

+2

這與您的問題沒有直接關係,但是您在此代碼中存在一些嚴重的SQL注入漏洞,您應該清理這些漏洞。確保在mysql_real_escape_string()或某些類似的函數中將所有輸入包含到查詢中。 – Asaph

+0

這只是練習m8,它永遠不會看到我向你保證的網絡 – ant

+0

請記住,在內部,日期列包括日期和時間。如果你想選擇從15日到16日的所有日期,你需要dt> = 15th和dt <17th(即16日在11:59.59.999 PM或更早) –

回答

1

因此,您希望在$ date_from和$ date_until之間找到預訂,即使它們僅覆蓋此日期範圍?有些事情是如此簡單,因爲這應該足夠了......

SELECT * FROM reservation_logs WHERE room_log = '$apartman_id' 
AND dt_from <= $date_until 
AND dt_until >= $date_from ; 

它根本不包括任何預訂這之後日期範圍開始,和之前日期範圍結束任何預訂。任何遺留的事物必須在日期範圍內或重疊。

+0

不工作m8,我試過一個1st .. – ant

+0

好吧,這是一個非常標準的習慣用語 - 懷疑它是你的date_until和_date_from變量的格式。 –

+0

確保這些變量是YYYY-MM-DD格式 –

0
dt_until >= '$date_until' OR dt_until <= '$date_until' 

永遠是真實的......

+0

有沒有這個和下面的帖子之間的鏈接,當我用2與AND組合時沒有任何工作,而使用OR都忙碌.. – ant

0
dt_from >= '$date_from' AND dt_from <= '$date_until' 

...這是唯一真正的,如果$date_from = $date_until