在MySQL中查找可用的时间段

3

我正在尝试查找从UNIX开始到UNIX结束的时间范围是否可用。 我有如下数据:

id start      end
1  1309383000 1309390200
2  1305115200 1305129600
3  1305374400 1305403200

我试图运行一个查询,其中给出了起始时间和结束时间,并检查这段时间是否已被占用。但是,一个 start 可以在另一个条目结束时开始。我尝试了很多不同的方法,但无法使其正常工作。如有帮助将不胜感激。

我正在使用PHP调用查询。但是,如果可能的话,我希望使用纯MySQL来完成它。


你是否想要查找重叠的时间?可以看一下 BETWEEN / NOT BETWEEN SQL 运算符。 - Francesco Laurita
我对这些进行了很多测试,虽然我已经接近成功了,但它从未正常工作过。 - mikelbring
1
请尝试发布您的“更接近”的查询。 - Francesco Laurita
你的意思是什么?我没有在运行另一个查询。 - mikelbring
3个回答

1
select  if(max(end) >= $end, max(end), $end) - 
        if(min(start) <= $start, min(start), $start) - 
        if(sum(end - start) is null, 0, sum(end - start))  as FreeTime
where end > $start and start < $end

它有点能用,但我得到了很多奇怪的数字,不太确定该怎么处理它们。有时是一堆0,有时只是一个0,而那个0表示已被占用,但一堆0表示未被占用。有时我什么都没有得到,这意味着它未被占用。有什么想法吗? - mikelbring
空或零表示“没有空闲时间”,其他数字表示在时间范围内的空闲秒数。请发布您的测试(和数据集)。 - Saic Siquot
这是我尝试使用你的查询在你刚刚做出任何更改之前的方法。http://pastebin.com/iNJ3VxLp 基本上,我只是检查一个时间段之间的可用性,但一个时间段可以在另一个时间段结束时开始。 - mikelbring
这对于我的代码正常运行是必要的:但是可以在另一个时间段结束时开始。 - Saic Siquot

0
SELECT count(*)
FROM timeslots
WHERE ($your_start NOT BETWEEEN start AND end) AND
   ($your_end NOT BETWEEN start and end)

如果返回的计数> 0,则请求的时间段至少部分被占用。

这似乎总是返回一些东西。 - mikelbring
是的,它会返回一个数字,因为你正在进行计数。你必须检索该数字。如果是0,则时间段可用。否则就在使用中。嗯...或者我今天脑子不太好使。我想我的逻辑反了。尝试只使用“between”,而不是“not between”。这将使0 = 可用,非0 = 不可用。 - Marc B
它似乎没有做到。我在一个任务开始前安排了2小时的时间段,但返回值为0。然后我将其安排在任务结束时,返回值为1。 - mikelbring

0

将startTime加上1个单位,endTime减去1个单位,然后使用between子句检索行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接