再次预订系统和日期范围。 我已经阅读了这个主题Comparing date ranges以及其他许多内容, 但无法找到答案:(
请参阅SQLFiddle http://sqlfiddle.com/#!2/89b2b/2
我有预订表,ID
}中有ObjectID
,PeriodStart
,PeriodEnd
和DATE
类型MySQL
字段>
我的示例数据如下所示:
(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';
):
$from = '2014-08-15';
$to = '2014-08-19'
我希望在查询日期间隔内获取免费的ObjectID
。
问题是,对象的2
首次预订在2014-08-15
结束,我们希望从2014-08-15
开始新的预订。结束日期2014-08-19
也是如此。现有预订从这一天开始。 humans
可以,因为我们将日期计算为nights
,但如何将同一事项计算为MySQL
?
对于这些变量
$from = '2014-08-15';
$to = '2014-08-19'
我希望[2, 3]
作为查询的结果。
第二次查询
$from = '2014-08-14';
$to = '2014-08-19'
我想仅查询[3]
作为查询结果,因为ObjectID 2
已从13 aug
预订到15 aug
答案 0 :(得分:2)
完整的代码是:
SELECT DISTINCT ObjectID
FROM booking
WHERE ObjectID IN
(
SELECT ObjectID
FROM booking
WHERE PeriodStart <= '2014-08-19' AND PeriodEnd >= '2014-08-14'
)
+----------+
| OBJECTID |
+----------+
| 2 |
| 3 |
+----------+
答案 1 :(得分:0)
您只有结束日期不包含的情况。我将查询表达为:
select b.objectid
from booking b
group by b.objectid
having sum(b.PeriodStart < '2014-08-19' and B.PeriodEnd > '2014-08-14') = 0
这会计算预订的次数,涵盖您关心的之夜。如果有,则过滤掉对象。
答案 2 :(得分:0)
这似乎也有效?我错过了任何有问题的东西
SELECT DISTINCT(ObjectID)
FROM booking
WHERE PeriodStart <= '2014-08-19' AND PeriodEnd >= '2014-08-14'
答案 3 :(得分:0)
SELECT DISTINCT ObjectID
FROM booking
WHERE PeriodStart <= '2014-08-19'
AND PeriodEnd >= '2014-08-14';