【问题标题】:Checking if a timeslot/booking is taken检查是否占用了时间段/预订
【发布时间】:2018-06-15 07:16:42
【问题描述】:

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

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

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

假设预订表存储以下内容:

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

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

startat = 9:59
expiresat = 12:01

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

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

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

感谢您的宝贵时间。

【问题讨论】:

  • 你在哪个数据库平台上? (oracle/sql server/mysql)

标签: sql logic


【解决方案1】:

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

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

一个槽在所需用户到期日期之前开始并在所需用户开始日期之后结束时被占用。

【讨论】:

  • 这里也存在同样的问题。上面的 SQL 查询从服务器表返回了一个 serverip。 9:59-12:01的预订时间与10-12重叠,应视为无效预订。我使用了与原始帖子中提供的数据相同的数据。
  • @anditpainsme 。 . .您是否为 USEREXPIREDDATE 和 USERSTARTDATE 输入了正确的值?这是用户输入的两个不同的值。
  • 哦,对,一个愚蠢的疏忽。我实际上没有输入正确的值。看来这确实像我希望的那样工作。我会做一些进一步的测试并回信。非常感谢,我很痛苦
  • 非常感谢 Gordon 的解决方案,简单而有效的想法。
  • 如果我在 10-12 之间进行了预订,那么您提供的查询似乎认为所有 12 点之后的预订都无效,但上午 10 点之前的所有预订都有效
【解决方案2】:
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 是过期时间。

【讨论】:

    【解决方案3】:

    时间as this pic says 有四种可能,图中代表的代码是

    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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      • 2018-12-23
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多