Mysql 订票日期不限

Mysql 订票日期不限,mysql,sql,date,date-range,Mysql,Sql,Date,Date Range,再次预订系统和日期范围。 我读过这个话题和其他很多话题, 但找不到答案:( 请看小提琴 我有预订表,在MySQL中有ID、ObjectID、PeriodStart和periodsend类型的DATE字段 我的示例数据如下所示: (1, 3, '2014-08-07', '2014-08-14'), (2, 3, '2014-08-19', '2014-08-23'), (3, 2, '2014-08-13', '2014-08-15'), (4, 2, '2014-08-19', '2014-0

再次预订系统和日期范围。 我读过这个话题和其他很多话题, 但找不到答案:(

请看小提琴

我有预订表,在
MySQL
中有
ID
ObjectID
PeriodStart
periodsend
类型的
DATE
字段 我的示例数据如下所示:

(1, 3, '2014-08-07', '2014-08-14'),
(2, 3, '2014-08-19', '2014-08-23'),
(3, 2, '2014-08-13', '2014-08-15'),
(4, 2, '2014-08-19', '2014-08-21');
我的查询日期间隔是(已更新,是
$from='2014-08-14';
):

我想获得在查询日期间隔内免费的
ObjectID
s。
问题是,object的
2
第一次预订在
2014-08-15
结束,我们想从
2014-08-15
开始进行新的预订。结束日期
2014-08-19
也是一样。现有的预订从这一天开始。对于
人来说这没问题,因为我们将日期周期计算为
,但是如何告诉MySQL同样的事情

对于这些变量

$from = '2014-08-15';
$to = '2014-08-19'
我想得到
[2,3]
作为查询的结果

第二个问题

$from = '2014-08-14';
$to = '2014-08-19'
作为查询结果,我只想获得
[3]
,因为ObjectID
2
是从
8月13日
预订到
8月15日
的,完整代码是:

SELECT DISTINCT ObjectID
FROM booking
WHERE ObjectID IN
(
SELECT ObjectID
FROM booking
WHERE PeriodStart <= '2014-08-19' AND PeriodEnd >= '2014-08-14'
)

Fiddle:您只是遇到了一种情况,即结束日期不包括在内。我可以将查询表示为:

select b.objectid
from booking b
group by b.objectid
having sum(b.PeriodStart < '2014-08-19' and B.PeriodEnd > '2014-08-14') = 0
选择b.objectid
预订b
b.objectid分组
总和(b.PeriodStart<'2014-08-19'和b.periodsend>'2014-08-14')=0

这会计算您所关心的夜晚的预订次数。如果有,则对象会被过滤掉。

这似乎也有效?我是否遗漏了任何问题

SELECT DISTINCT(ObjectID)
FROM booking
WHERE PeriodStart <= '2014-08-19' AND PeriodEnd >= '2014-08-14'
SELECT DISTINCT(ObjectID)
从预订
其中PeriodStart='2014-08-14'
选择不同的ObjectID
从预订
其中PeriodStart='2014-08-14';

WHERE PeriodStart='2014-08-14'
:我是否误解了你的问题,或者你是否颠倒了PeriodStart和periodsend?为什么
2
会出现在结果中?@GordonLinoff说得对。我的错误是:(是否有理由对似乎有效的逻辑投反对票?)你的查询在我看来很好,或者我真的没有得到op想要的。他说他想要对象2、3的结果,但对象2在2014-08-14期间有预订,所以…@Logar谢谢。我的错误。我只想查询日期
14-19八月
只有ObjectID 3,而对于查询
15-19八月
两者
[2、3]
。我已更新了问题。很抱歉出错:(哦,对不起,senk-忽略了您的答案-但请注意,DISTINCT不是一个函数!多亏了@GordonLinoff,他发现了错误。如果对象2在8月13日至15日进行了数据库预订,您的查询如何正确回答?我已编辑了问题并更改了查询周期。您想要13日至15日或15日至19日?我想要在任何输入的时间间隔上得到正确的结果。对于查询
14-19年8月
必须只有一个结果
3
,对于查询
15-19年8月
必须有两个结果
[2,3]
您的数据现在很混乱…它有两行具有相同的值。对象ID具有不同的开始日期和结束日期。
:/
请详细解释。对象
3
已经有2个预订。对象
2
也有2个预订。什么相同的值?感谢您的回答,但提供的数据会返回错误的结果。我们已经为对象
2
预订了从
8月13日
8月15日
的期间。请参阅更新的问题。这不会返回2和3?现在我很困惑。也许您需要更具代表性的数据集和所需的结果集。
select b.objectid
from booking b
group by b.objectid
having sum(b.PeriodStart < '2014-08-19' and B.PeriodEnd > '2014-08-14') = 0
SELECT DISTINCT(ObjectID)
FROM booking
WHERE PeriodStart <= '2014-08-19' AND PeriodEnd >= '2014-08-14'
SELECT DISTINCT ObjectID
  FROM booking
 WHERE PeriodStart <= '2014-08-19' 
   AND PeriodEnd >= '2014-08-14';