首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >检查是否进行了时隙/预订

检查是否进行了时隙/预订
EN

Stack Overflow用户
提问于 2013-01-29 23:45:54
回答 3查看 2K关注 0票数 0

编辑:戈登发布的查询似乎有问题。如果我有一个10-12的预订,它似乎认为下午12点以后的所有预订都无效,但上午10点之前的所有预订都是有效的。

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

代码语言:javascript
复制
SELECT serverip 
        FROM   server 
        WHERE  serverip NOT IN (SELECT serverip 
                                FROM   booking 
                                WHERE  startat >= datehere 
                                AND expiresat <= datehere) 
        LIMIT  1; 

假设booking表存储以下内容:

代码语言:javascript
复制
+-----------+-----------+----------+----------+-----------+
| bookingid | serverip  | username | startat  | expiresat |
+-----------+-----------+----------+----------+-----------+
|         1 | 127.0.0.1 | testuser | 10:00    | 12:00     |
+-----------+-----------+----------+----------+-----------+

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

代码语言:javascript
复制
startat = 9:59
expiresat = 12:01

他们可以很容易地绕过我的检查,看看预订时间是否基于之前存储的预订而可用。

对于如何更好地解决这个问题,有什么建议吗?

我更喜欢而不是来限制用户输入,并希望避免硬编码特定的时间段,如果这不是问题,但我会坚持我已经得到的。

耽误您时间,实在对不起。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-30 02:28:08

代码语言:javascript
复制
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是到期时间。

票数 1
EN

Stack Overflow用户

发布于 2013-01-29 23:53:24

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

代码语言:javascript
复制
SELECT serverip 
FROM  server 
WHERE serverip NOT IN (SELECT serverip 
                       FROM booking 
                       WHERE startat <= USEREXPIREDATE AND
                             expiresat >= USERSTARTDATE
                      ) 
LIMIT  1; 

当插槽在期望的用户到期日期之前开始并且在期望的用户开始日期之后结束时,它被占用。

票数 5
EN

Stack Overflow用户

发布于 2018-06-15 07:05:34

time as this pic says 有四种可能性,图片中表示的代码是

代码语言:javascript
复制
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))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14586739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档