我创建了一个存储过程:
CREATE PROCEDURE `CheckSlotAvailability`(IN slotId INT)
BEGIN
DROP TEMPORARY TABLE IF EXISTS tempres1;
CREATE TEMPORARY TABLE tempres1
SELECT
`slot_id`,
`customer_id`,
IFNULL(`start`, 'empty') AS `start`,
IFNULL(`end`, 'empty') AS `end`,
IFNULL(`in`, 'empty') AS `in`,
IFNULL(`out`, 'empty') AS `out`,
`parking_type`,
`status`
FROM reservations;
DROP TEMPORARY TABLE IF EXISTS tempres2;
CREATE TEMPORARY TABLE tempres2
SELECT
slot_id,
`customer_id`,
MIN(`start`) AS `start`,
MAX(`end`) AS `end`,
MIN(`in`) AS `in`,
MAX(`out`) AS `out`,
`parking_type`,
`status`
FROM tempres1
GROUP BY slot_id, customer_id;
DROP TEMPORARY TABLE IF EXISTS tempres3;
CREATE TEMPORARY TABLE tempres3
SELECT * FROM tempres2 WHERE slot_id = slotId;
SELECT * FROM TEMPRES3;
END
它返回停车位的保留时间:
从这个表:
我们怎么才能把可用的时间用在这上面呢?
假设每个slot_id都有一个小时范围,
开始:2023-05-30 15:00:00
结束:9999-12-30 00:00:00
因为根据上面的图像2023-05-30 18:00:00
直到2023-05-30 20:00:00
被占用,这意味着唯一可用的时间如下:
2023-05-30 15:00:00
至2023-05-30 17:59:59
2023-05-30 20:00:00
至9999-12-30 00:00:00
请注意,可能有多个预订在一个单一的插槽,我只需要得到可用的时间。
MySQL/MariaDB:v10.10.2-MariaDB
我已经努力了好几天了,尽我最大的努力去解决它,但对我来说似乎是不可能的:)。
先谢谢你了。
1条答案
按热度按时间piv4azn71#
如果你知道一些概念,逻辑并不复杂。假设你有这些 * 占用 * 日期:
| 开始_dt| end_dt|
| - -----|- -----|
| ......这是什么?|......这是什么?|
| 2023-06-01 06:00:00| 2023-06-01 18:00:00|
| 2023-06-02 06:00:00| 2023-06-02 18:00:00|
| 2023-06-03 06:00:00| 2023-06-03 18:00:00|
| 2023-06-04 06:00:00| 2023-06-04 18:00:00|
| ......这是什么?|......这是什么?|
输入范围:
| @dt1| @dt2|
| - -----|- -----|
| 2023-06-01 12:00:00| 2023-06-04 12:00:00|
然后首先找到与该范围相交的所有占用率。结果将是这4行:该范围从第一行的中间开始并在第四行的中间结束。
现在,您将开始日期和结束日期从结果中提取到单个列中:结束日期应被视为 * 可用 * 时隙的开始日期,反之亦然。将输入的开始和结束日期添加到此列中以确保完整性。
最后,使用
lag
函数匹配结束日期和开始日期。类似于:
DB<>Fiddle