查询所需汽车的日期范围

时间:2019-02-13 07:57:27

标签: mysql sql date group-by

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

表“ car”具有以下列

CREATE FUNCTION SHOW_ADMIN(PID INT(11)) RETURNS VARCHAR(50) BEGIN declare retval varchar(50) default ""; set retval = (SELECT NAME FROM ADMINS WHERE ID = PID); RETURN retval; END ->主键

id-> SUV,标准,经济型汽车的名称

name->可用汽车数量

表“预订”具有以下列

count->预留ID自动递增

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

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

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

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

所以输出应类似于此表。

----日期----- 汽车名称 可用性/短缺

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

2019-01-01 经济型 -1

负号表示短缺

正号表示有空

我做了什么

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

car_name

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

1 个答案:

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