编辑:戈登发布的查询似乎有问题。如果我有一个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
他们可以很容易地绕过我的检查,看看预订时间是否基于之前存储的预订而可用。
对于如何更好地解决这个问题,有什么建议吗?
我更喜欢而不是来限制用户输入,并希望避免硬编码特定的时间段,如果这不是问题,但我会坚持我已经得到的。
耽误您时间,实在对不起。
发布于 2013-01-30 02:28:08
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-29 23:53:24
您需要更改重叠的逻辑。试试这个:
SELECT serverip
FROM server
WHERE serverip NOT IN (SELECT serverip
FROM booking
WHERE startat <= USEREXPIREDATE AND
expiresat >= USERSTARTDATE
)
LIMIT 1;
当插槽在期望的用户到期日期之前开始并且在期望的用户开始日期之后结束时,它被占用。
发布于 2018-06-15 07:05:34
time 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))
https://stackoverflow.com/questions/14586739
复制相似问题