存储并显示多个日期范围值SQL

时间:2015-11-05 11:05:09

标签: mysql sql database database-design mysqli

我目前正在开发租车系统,并对预订汽车有一些不确定性。如何显示预订车辆的所有日期。

示例

  

汽车BMV保留于2015年11月11日至2015年12月5日,也将于2005年11月30日至5月30日   2015年12月10日和2015年12月10日至2015年12月25日

如果clint想在这个日期进行新的预订,我将创建ALERT“这个日期是为汽车保留的。”

所有这些都适用于单一预订日期,但我需要多个。

我的cuttent数据库看起来像这样:

预订:

    id  customer_id  car_id  booking_date  return_date  time_stamp      
------  -----------  ------  ------------  -----------  ----------------
     1            2       5  2015-11-04    2015-11-12   15.06.10 20:10  
     2            3       2  2015-11-02    2015-11-13   15.06.10 20:10  
     3            1      11  2015-11-05    2015-11-16   15.06.10 20:10  
     4            4       8  2015-11-10    2015-12-16   15.06.10 20:10  

汽车:

   id  car_type_id  branch_id  registration_number  color    date_of_manifacturing  base_price_per_day  
------  -----------  ---------  -------------------  -------  ---------------------  --------------------
     1            1          1  BG-123-431           White     2010-11-15                               30
     2            2          1  BG-A32-212           Metalic  2015-11-04                               30
     3            3          2  PA-332-421           Metalic  2008-05-03                               35
     4            4          1  SM-312-542           Black     2014-06-01                               35
     5            5          1  BG-4393-54           Black     2012-05-03                               50
     6            6          1  NS-423-64            White     2010-10-08                               50

5 个答案:

答案 0 :(得分:1)

假设这是一整天的预订,那么您可以加入这两张表来获取特定汽车的所有预订日期,例如,如果宝马汽车是car_id 5,那么此查询:

SELECT
  c.*,
  b.booking_date,
  b.return_date
FROM Car AS c
INNER JOIN Bookings AS b ON c.id = b.car_id
WHERE c.id = 5;

将为您提供该车booking_datereturn_date的列表。

然后,对于格式化par,我不建议您在SQL中以您希望的方式格式化日期。更好的是,在你的后端应用程序中,你可以循环它们并以你想要的方式显示它们。

答案 1 :(得分:0)

继续您的表格结构,您应该能够在Bookings表中插入一个新行,以显示同一辆车的二级租用期。当通过GROUP BY车辆ID加入其他表时,这应该有效。

INSERT INTO Bookings
    (Secondary Booking Information)

SELECT
    car_id,
    MAX(CASE WHEN @DESIRED_DATE NOT BETWEEN booking_date AND return_date THEN 'True' ELSE NULL END) AS AvailabilityCheck
FROM Bookings
GROUP BY car_id

答案 2 :(得分:0)

左边加入汽车表,预订以了解他们当前的预订状态,然后按汽车ID分组

select car.id,car.car_type_id,car.registration_number,
     coalesce(group_concat('Reserverd from ',concat(Bookings.booking_date,' to ',Bookings.return_date)),'Open for bookings') as Booking_status
from car
left join Bookings on car.id=bookings.car_id
group by car.id

SQL小提琴示例:http://sqlfiddle.com/#!9/c8c76/4

答案 3 :(得分:0)

SELECT aa.car_type_id, aa.registration_number, bb.car_id, 
CONCAT(DAYOFMONTH(bb.booking_date),'.',MONTH(bb.booking_date),'-',YEAR(bb.booking_date)) AS from_date, 
CONCAT(MONTH(bb.return_date),'.',DAYOFMONTH(bb.return_date),'-',YEAR(bb.return_date)) AS to_date
FROM Car AS aa
INNER JOIN Bookings AS bb
ON aa.id = bb.car_id
WHERE aa.id = 1 AND 'your_date' NOT BETWEEN (bb.booking_date AND bb.return_date);

答案 4 :(得分:0)

如果您想一次选择所有汽车,请尝试group_concat

select t.*,group_concat(concat('from:', t2.booking_date,' to: ',t2.return_date)) reserved_ranges
from cars t
left join bookings t2 on t2.car_id = t.id
group by t.id;