2013-01-14 40 views
-1

我正在为一个朋友为假期预订系统。SQL选择?

当他进入假期时,我需要检查日期是否已被使用,如果他们显然无法创建预订。

我目前使用:

SELECT * 
FROM anqehxy1kxmeowpcoqjj 
WHERE `from` BETWEEN '2013-01-16' AND '2013-01-23' 

SELECT * 
FROM anqehxy1kxmeowpcoqjj 
WHERE `to` BETWEEN '2013-01-16' AND '2013-01-23' 

,看看我是否可以预订从2013年1月16日放假,直到2013年1月23日。

在数据库中已经有2013-01-15预订,直到2013-01-22,这意味着我正在尝试预订的日期已经被占用;然而sql返回0行,除非我使用与已经使用的日期完全相同的日期。

关于如何解决这个问题的任何想法?

编辑:作为一个说明,人们在上午10点离开,下一个人在下午2点到达。

因此,如果连续两周被黄牌警告它看起来像

2013-01-14 -> 2013-01-21 
2013-01-21 -> 2013-01-28 
+1

你的日期存储为? – climbage

+0

日期的存储方式如下:2013-01-14 – Ryuk

+0

您是将日期存储为范围还是每天有单独的条目?例如。对于1-16到1-23,是db或8条目中的1个条目? – Watki02

回答

5

不能逆转的日期,就像你的第二个查询完成。将其更改为

SELECT * 
FROM anqehxy1kxmeowpcoqjj 
WHERE `to` BETWEEN '2013-01-16' AND '2013-01-23' 

在旁边注:是您的表名真的是anqehxy1kxmeowpcoqjj?!

+0

这解决了我最初的问题,但是它会导致另一个问题,如我在编辑 – Ryuk

+0

中所解释的那样。对不起,我无法理解新问题。你能否添加更多细节? – bfavaretto

+0

这个新问题真的很简单。将被预订的房间将在假期的最后一天腾空,清理完毕,然后下一个小组进入(同一天)。在第一周的最后一天与第二周的第一天发生冲突时,您给我的SQL目前是不可能的。我希望这可以帮助 – Ryuk

1

要得到两个日期,如果他们与任何日期冲突,我使用这样的查询。该查询将返回哪些日期有冲突。如果没有行被返回,那意味着特定的时隙是空闲的。 @start_time和@end_time是您想预订

select * from anqehxy1kxmeowpcoqjj 
where((@end_time > `from` and @end_time <= `to`) or 
     (@start_time >= `from` and @start_time < `to`) or 
     (@start_time <= `from` and @end_time >= `to`)) 
+0

这不是一个正确的答案..看看'bfavaretto'的答案是一个很好的例子 – MethodMan

+0

DJ_KRAZE,虽然bfavaretto的答案解决了我最初的问题,但这些都不能解决我编辑中描述的问题。 – Ryuk

+0

@DJKRAZE这不是一种用单个查询修复它(最初的问题)的方法吗?我的答案基于OP的双查询方法。 – bfavaretto

0

日期参数,我认为最简单的方法是:

select * 
from anqehxy1kxmeowpcoqjj 
where @end_time >= `to` and @start_time <= `from` 

这是一个重叠的时间间隔问题的一个例子。当第一次开始时或第二次结束之前或第一次开始之后结束时,两个区间重叠。

根据是否包含结束日期,您可能需要<>而不是<=和`> ='。