0

编辑:戈登发布的查询似乎有问题。如果我在 10 点至 12 点之间进行预订,似乎认为所有 12 点之后的预订都无效,但上午 10 点之前的所有预订都有效。

一些快速而简单的想法最终让我创建了以下查询:

SELECT serverip 
        FROM   server 
        WHERE  serverip NOT IN (SELECT serverip 
                                FROM   booking 
                                WHERE  startat >= datehere 
                                AND expiresat <= datehere) 
        LIMIT  1; 

假设 booking 表存储以下内容:

+-----------+-----------+----------+----------+-----------+
| bookingid | serverip  | username | startat  | expiresat |
+-----------+-----------+----------+----------+-----------+
|         1 | 127.0.0.1 | testuser | 10:00    | 12:00     |
+-----------+-----------+----------+----------+-----------+

如果用户要为预订输入以下数据:

startat = 9:59
expiresat = 12:01

他们可以轻松绕过我的检查,根据之前存储的预订查看预订时间是否可用。

关于如何更好地解决这个问题的任何建议?

希望限制用户输入,并且希望避免对特定时间段进行硬编码,如果这不是问题,但我会坚持我所拥有的。

谢谢你的时间。

4

3 回答 3

5

您需要更改重叠的逻辑。试试这个:

SELECT serverip 
FROM  server 
WHERE serverip NOT IN (SELECT serverip 
                       FROM booking 
                       WHERE startat <= USEREXPIREDATE AND
                             expiresat >= USERSTARTDATE
                      ) 
LIMIT  1; 

当一个插槽在所需的用户到期日期之前开始并在所需的用户开始日期之后结束时,它会被占用。

于 2013-01-29T15:53:23.690 回答
1
SELECT *
FROM server
WHERE serverip NOT IN
(SELECT serverip 
 FROM booking
 WHERE
   (startat <= '2013-01-30 08:00:00' AND expiresat >= '2013-01-30 08:00:00') OR
   (startat <= '2013-01-30 09:00:00' AND expiresat >= '2013-01-30 09:00:00') OR
   (startat >= '2013-01-30 08:00:00' AND expiresat <= '2013-01-30 09:00:00'))

其中 8:00 是开始时间,9:00 是过期时间。

于 2013-01-29T18:28:08.153 回答
0

正如这张图片所说,时间有四种可能性,图片中表示的代码是

SELECT Id FROM reservations 
WHERE 
((start_at < @start_at AND start_at < @end_at) AND (end_at > @start_at AND end_at < @end_at))
OR((start_at > @start_at AND start_at < @end_at) AND (end_at > @start_at AND end_at > @end_at))
OR((start_at <= @start_at AND start_at <= @end_at) AND (end_at >= @start_at AND end_at >= @end_at))
OR((start_at >= @start_at AND start_at <= @end_at) AND (end_at >= @start_at AND end_at <= @end_at))
于 2018-06-14T23:05:34.040 回答