2011-05-26 28 views
2

我正在租汽車網站,汽車可以保留給定的時間段。例如,一個汽車01.01.2011 - 10.01.2011 and 15.01.2011 - 25.01.2011. (dd.mm.yyyy)租一輛車 - 如何檢查兩輛日期之間是否有車?

之間保留所以車子之間11.01.2011 - 14.01.2011.

我應該如何繼續保留的記錄可用?如果我製作一個名爲'reservations'的表併爲'carID' 'startDate' 'endDate'創建列,我該如何檢查汽車在兩個日期之間是否完全可用?或者我應該如何創建預訂表?

+2

選中此項:http:// stackoverflow。com/questions/4165655/mysql-select-rows-where-date-not-between-date這看起來像一個相同的問題 – 2011-05-26 12:41:09

+0

你將不得不查詢汽車表,看carID是否在預訂表中,然後設置你的日期,希望這是有道理的,因爲它使我困惑寫作! – Liam 2011-05-26 12:44:13

回答

5

我會使用時間戳做到這一點。我知道MySQL內置了DATETIME字段類型,但我通常更喜歡使用時間戳。反正這裏是我會怎麼去了解它

vehicles表:

id | name 
--------- 
1 | Ford Mustang 

reservations表:

id | vehicle_id | start_time | end_time 
---------------------------------------- 
1 | 1   | 130500040 | 130599304 

凡START_TIME和END_TIME是UNIX時間戳。

然後,當你想看看是否有車(取決於汽車改變vehicle_id查詢)是適用於某些日期:

$start_date = strtotime($start_date); 
$end_date = strtotime($end_date); 
$query = mysql_query("SELECT * FROM `reservations` WHERE `vehicle_id`=1 AND (`start_date`>".$start_date." AND `end_date`<".$end_date.") OR (`start_date`<".$start_date." AND `end_date`>".$end_date.") OR (`start_date<".$end_date." AND `end_date`>".$end_date.") OR (`start_date`<".$start_date." AND `end_date`>".$start_date.")"); 

if (mysql_num_rows()<1) 
{ 
    echo "The vehicle is available"; 
} 
+0

正如我所見,他使用格式dd.mm.yyyy而不是dd/mm/yy。所以他的格式很容易通過php核心函數strtotime轉換。 – RRStoyanov 2011-05-26 13:06:07

+0

謝謝。編輯來反映。 – Dormouse 2011-05-26 13:10:04

+0

但這種方式我檢查汽車是否可用於1日期。我需要知道汽車是否在兩個日期之間可用,一段時間。 – SmT 2011-05-26 13:20:45

2

創建兩個表 - 一個用於保存您的車輛信息,另一個用於保存所有預訂(如您在問題中所述)。當您需要檢查可用性時,僅查詢預訂表。

請注意您的客戶可能想要超量預訂或不按時返回汽車的情況。或者汽車在非常糟糕的情況下返回,您需要先維修。還有很多未知的情況,所以國際海事組織你應該允許預訂之間至少有+/- 1或2天的差距。如果你有一種以上的汽車,那麼你可能會面臨很多問題。

+0

我不認爲這實際上已經回答了這個問題,我不只是這麼說,因爲我在這裏也有答案。你還沒有回答「我怎麼檢查汽車是否完全可用?」或者真的「我應該如何創建預訂表?」只需要那一個。第二段也不太關於編程和更多關於汽車租賃行業。 -1 – Dormouse 2011-05-26 13:13:05

+0

沒有提供示例的點(編輯順便說一句,你的很好)。另一方面,我不認爲應該避免提供額外的但有用的信息。 – RRStoyanov 2011-05-26 13:16:54

1

這裏的另一種方式,我發現(通過Mysql filling in missing dates)。創建3個表格:車輛,固定預訂和當年的所有可用日期。

reservations: id, booked, vehicle_ref 

insert into reservations values (0, '2011-01-12',1); 
insert into reservations values (0, '2011-01-13',1); 
insert into reservations values (0, '2011-01-14',1); 
insert into reservations values (0, '2011-01-20',1); 
insert into reservations values (0, '2011-01-21',1); 

reservations_free: free (just a list of all dates this year...) 

insert into reservations_free values 
('2011-01-10'), 
('2011-01-11'), 
('2011-01-12'), 
('2011-01-13'), 
('2011-01-14'), 
('2011-01-15'), 
('2011-01-16'), 
('2011-01-17'), 
('2011-01-18'), 
('2011-01-19'), 
('2011-01-20'), 
('2011-01-21'), 
('2011-01-22'), 
('2011-01-23'); 

檢索未1月1日和2月1日之間預訂車輛#1的所有日期:

SELECT free 
FROM reservations_free 
LEFT OUTER JOIN reservations ON (reservations.booked = reservations_free.free AND reservations.vehicle_ref =1) 
WHERE booked IS NULL AND 
reservations_free.free 
BETWEEN '2011-01-01' 
AND '2011-02-01' 
ORDER BY free 
LIMIT 0 , 30; 

獲取你的列表:

2011-01-10 
2011-01-11 
2011-01-15 
2011-01-16 
2011-01-17 
2011-01-18 
2011-01-19 
2011-01-22 
2011-01-23 

當然你必須爲了每年維護reservations_free表,這個sql語句可能需要進一步優化,因爲我只是從原始的表單中弄出來的。

使用mysql日期字段意味着你可以瀏覽你的數據,它仍然會對你有一定的意義。

添加和刪除一天將是一個辛苦。

它沒有按照要求提供「在15日和19日之間免費」,但如果不是在一個稍微複雜的sql語句中,應該可以在PHP中實現。