-1

我正在为朋友制作假期预订系统。

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

我目前正在使用:

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-01-16 到 2013-01-23 的假期。

在数据库中已经有一个从 2013 年 1 月 15 日到 2013 年 1 月 22 日的预订,这意味着我尝试预订的日期已经被预订;但是,除非我使用与已经使用的日期完全相同的日期,否则 sql 会返回 0 行。

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

请注意,人们在上午 10 点离开,下一个人在下午 2 点到达。

所以如果连续两周被预订,它看起来像

2013-01-14 -> 2013-01-21 
2013-01-21 -> 2013-01-28
4

3 回答 3

5

您不能像在第二个查询中所做的那样反转日期。将其更改为

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

附带说明:您的表名真的anqehxy1kxmeowpcoqjj吗?!

于 2013-01-14T16:36:42.763 回答
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`))
于 2013-01-14T16:40:28.627 回答
0

我认为最简单的方法是:

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

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

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

于 2013-01-14T17:25:40.417 回答