gpt4 book ai didi

php - 使用 SQL 查找可用时间段

转载 作者:行者123 更新时间:2023-11-29 13:25:10 25 4
gpt4 key购买 nike

我发现了一个answer这里关于在数据库中查找可用时隙的常见问题。该查询的工作方式就像一个魅力,但如果我添加一个在已添加的事件之前启动的新事件,它就会开始失败。在这种情况下,输出的顺序是错误的。已经有 sqlFiddle在答案中的示例中,我刚刚在架构中添加了一个新行:

insert into bookingEvents values (null, '2013-05-12 05:11:00', 15);

正如您所看到的,事件日期早于上次插入的事件日期(它们不再按时间预订排序)。也许我试图在查询中放入太多的逻辑,如果是这样的话,我该如何用 PHP 来处理这个事情呢?

编辑

也许我应该首先展平时间戳,然后对结果执行查询。我发现something压平时间戳,但我需要帮助来合并两个查询并获得针对生产进行优化的内容

最佳答案

为了保持理智,我创建了一个 View ,如下......

CREATE VIEW v_bookingevents AS 
SELECT id
, timebooked startdate
, timebooked + INTERVAL duration MINUTE enddate
FROM bookingevents
ORDER
BY startdate;

然后...

SELECT a.enddate 'Available From'
, MIN(b.startdate) 'To'
FROM
(

SELECT DISTINCT
COALESCE(LEAST(x.startdate,y.startdate),x.startdate) startdate
, COALESCE(GREATEST(x.enddate,y.enddate),x.enddate) enddate
FROM v_bookingevents x
LEFT
JOIN v_bookingevents y
ON y.id <> x.id
AND y.startdate < x.enddate
AND y.enddate > x.startdate
UNION
SELECT '2013-05-12 00:00:00'
, '2013-05-12 00:00:01'

) a
JOIN
(
SELECT DISTINCT
COALESCE(LEAST(x.startdate,y.startdate),x.startdate) startdate
, COALESCE(GREATEST(x.enddate,y.enddate),x.enddate) enddate
FROM v_bookingevents x
LEFT
JOIN v_bookingevents y
ON y.id <> x.id
AND y.startdate < x.enddate
AND y.enddate > x.startdate

UNION
SELECT '2013-05-15 00:00:00'
,'2013-05-15 00:00:01'
) b
ON b.startdate > a.enddate
GROUP
BY a.enddate
HAVING a.enddate < MIN(b.startdate);

http://sqlfiddle.com/#!2/e67b47/1

显然,你可以在没有 View 的情况下重写它 - 我只是发现很难读取所有这些“+ INTERVAL”位。

关于php - 使用 SQL 查找可用时间段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20247527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com