2012-05-20 19 views
0

我工作的一個劇本,我的工作,租輛自行車,但我不知道如何檢查自行車的可用性的X時期查詢條件出租

數據庫的樣子:

CustomerID BicycleID FromDATE TillDATE  
    43   12  2012-05-20 2012-05-23 
    43   14  2012-05-20 2012-05-23 
    44   12  2012-05-27 2012-05-30 
    44   15  2012-05-27 2012-05-30 

有沒有一個腳本,我可以運行之前,我做一個新的合同或預訂檢查或自行車可用一段時間?

對此的任何幫助將是偉大的,謝謝!

+0

Fyi,它是'自行車',不是'bycicle'。修復這個問題,否則後來處理你的代碼的人會恨你,因爲必須小心地打錯字。 – ThiefMaster

+0

[重疊日期範圍MySQL]的可能的重複(http://stackoverflow.com/questions/3667668/overlapping-date-range-mysql) – ThiefMaster

回答

0

參見Determine Whether Two Date Ranges Overlap

爲了測試兩個週期重疊,使用(StartDate1 <= EndDate2) and (StartDate2 <= EndDate1)

SELECT * FROM reservations WHERE ? <= TillDATE AND FromDATE <= ? 

第一個參數在此查詢應該是新的保留的開始日期,該第二個中的結束日期。

這將返回所有與新的碰撞預留。

+0

我可以使用'日期'或我應該使用'時間戳'? –

+0

任何類型都可以使用'<='正常工作。如果您只存儲日期,則使用'DATE',如果您還想包含時間則使用'DATETIME'。切勿使用'TIMESTAMP',因爲每當更新行時它都會自動碰撞到當前時間。看到http://dev.mysql.com/doc/refman/5.1/en/datetime.html – ThiefMaster

+0

當我使用這個SQL它會返回一個錯誤:「SELECT * FROM'reservations' WHERE?<='2012-05-24 'AND'2012-05-20' <=?「我究竟做錯了什麼? –

0

我認爲,如果你可以存儲日期在TIMESTAMPUNIX)格式,則可以很容易地使用> < =運算來比較所需的租賃時段和自行車的不可用性。

+0

將UNIX時間戳存儲在具有'DATE'類型的數據庫中是一個壞主意(儘管它在PHP世界中非常常見,因爲幾乎每個PHP應用程序都在內部使用unix時間戳)。 – ThiefMaster

+0

@ ThiefMaster〜謝謝,如果你能解釋爲什麼這是一個糟糕的主意,這將是有趣的。 :) – John

+1

你不能使用MySQL提供的所有[日期函數](http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html)。這經常會導致人們使用PHP重新實現它們,儘管它可能完全在數據庫中完成。最常見的是'WHERE col <'。(time() - 86400)'等。 – ThiefMaster

0

如果這些簡單的固定期限的租金是簡單從直等到

Select count(*) from hiresTable 
where $From < TillDATE 
and $Till > FromDATE 

如果租期不固定之間搜索的可用性,這是不準確的因爲有兩個僱員可能是由側內邊搜索範圍。