【问题标题】:Store and show multiple date range value SQL存储和显示多个日期范围值 SQL
【发布时间】:2015-11-05 11:05:09
【问题描述】:

我目前正在研究汽车租赁系统,并且对预订汽车有一些不确定性。订车时如何显示所有日期。

示例。

汽车 BMV 从 11.20 2015 到 05.12.2015 以及 30.11.205 到 10.12.205 和 10.12.2015 到 25.12.2015

如果 clint 想在这个日期进行新的预订,我将创建 ALERT "This date is reserved for the car"。

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

我的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

【问题讨论】:

  • 你所说的“我需要多个”是什么意思,你能举例说明一下汽车 id 5 的预期结果是什么吗?
  • 像我一样检查从 2012 年 6 月 1 日下午 5:00 到 2012 年 6 月 3 日上午 11:00 以及其他日期到另一个日期等期间是否有车...类似酒店预订系统
  • 标记为不具建设性。 OP 没有要求你质疑他的商业计划。

标签: mysql sql database database-design


【解决方案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 列表。

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

【讨论】:

  • @Ivke - 不客气,如果有帮助,请尝试接受答案。
【解决方案2】:

继续您的表格结构,您应该能够在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

【讨论】:

    【解决方案3】:

    左加入 car table 以了解其当前的预订状态,然后按 car 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

    【讨论】:

      【解决方案4】:
      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);
      

      【讨论】:

        【解决方案5】:

        如果您想一次性选择所有汽车,请尝试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;
        

        【讨论】:

          猜你喜欢
          • 2011-06-16
          • 2018-05-16
          • 1970-01-01
          • 2016-12-16
          • 2015-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-19
          相关资源
          最近更新 更多