租车 - 如何检查两个日期之间是否有车?

时间:2011-05-26 12:35:27

标签: php html mysql date

我正在租一个汽车站点,汽车可以预留一段时间。例如,在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'创建列,如何检查两个日期之间的汽车是否完全可用?或者我应该如何创建预订表?

3 个答案:

答案 0 :(得分: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";
}

答案 1 :(得分:2)

创建两个表 - 一个用于保存您的车辆信息,另一个用于保存您的所有预订(如您在问题中所述)。当您需要检查可用性时,只查询预订表。

请注意您的客户可能希望超量预订或未按时归还车辆的情况。或者汽车返回状况非常糟糕,您需要先维修。还有更多未知情况,因此IMO应该允许预订之间至少有+/- 1或2天的差距。如果你有一辆以上的车型,那么你可能面临的问题并不多。

答案 2 :(得分: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日和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 DATE字段意味着您可以浏览您的数据,它仍然会让您感觉像人一样。

添加和删除一天将很容易。

它没有按照要求提供“1月15日至19日之间的免费”,但如果不是在稍微复杂的sql语句中,这应该在PHP中可行。