【问题标题】:Query required cars for a date range查询日期范围内所需的汽车
【发布时间】:2019-02-13 07:57:27
【问题描述】:

我在数据库中有两个表。 '汽车','预订'

表格“汽车”具有以下列

id -> 主键

name -> 车辆名称,如 SUV、STANDARD、ECONOMY

count -> 可用汽车数量

表 'reservation' 有以下列

id -> 预留 id 自动递增

date_out -> 预订开始日期,例如:'2019-01-01 00:00:00'

date_in -> 预订结束日期,例如:'2019-01-05 23:59:59'

car_name -> 表'car'中的汽车名称之一

我想查询数据库以显示某个日期范围内每种类型汽车的可用性/短缺情况。

所以输出应该和这张表类似。

----date----- car_name 可用性/短缺

2019-01-01 ----SUV---- 1

2019-01-01 经济 -1

负号表示短缺

正号表示可用性

我做了什么

此查询仅适用于指定的单个日期和汽车名称。

Set @forDate = '2019-02-14';
Set @car = 'STANDARD';


Set @total_reservation = (select count(*) as total_reservation from (
select date_out, date_in, car_type from reservation 
where date_in > @forDate and date_out < @forDate
and car_type = @car
)AS t1);

select @total_reservation;

Set @car_count = (select count from car where name = @car);

select @car_count;

select @car_count - @total_reservation;

我在将查询转换为用户输入的日期范围时遇到问题。

【问题讨论】:

标签: mysql sql date group-by


【解决方案1】:

您可以使用table of dates。在以下示例中,我将简单地键入日期:

SELECT datelist.dt, car.name, car.count - COUNT(reservation.id) AS available
FROM (
    SELECT '2019-02-14' AS dt UNION ALL -- check availability from date
    SELECT '2019-02-15' UNION ALL
    SELECT '2019-02-16' UNION ALL
    SELECT '2019-02-17' UNION ALL
    SELECT '2019-02-18' -- check availability to date
) AS datelist
CROSS JOIN car
LEFT JOIN reservation ON datelist.dt BETWEEN reservation.date_out AND reservation.date_in
      AND car.name = reservation.car_name
GROUP BY datelist.dt, car.name, car.count

在 MySQL 8 中,您可以使用递归 cte 来构建日期:

WITH RECURSIVE datelist AS (
    SELECT '2019-02-14' + INTERVAL 0 DAY AS dt
    UNION ALL
    SELECT dt + INTERVAL 1 DAY FROM datelist WHERE dt < '2019-02-18'
)
SELECT datelist.dt, car.name, car.count - COUNT(reservation.id) AS available
FROM datelist
CROSS JOIN car
LEFT JOIN reservation ON datelist.dt BETWEEN reservation.date_out AND reservation.date_in
      AND car.name = reservation.car_name
GROUP BY datelist.dt, car.name, car.count

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 2016-08-28
    • 1970-01-01
    相关资源
    最近更新 更多