2011-05-26 82 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中实现。