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