预订日期范围mysql php

时间:2014-09-02 12:12:56

标签: mysql sql date date-range

再次预订系统和日期范围。 我已经阅读了这个主题Comparing date ranges以及其他许多内容, 但无法找到答案:(

请参阅SQLFiddle http://sqlfiddle.com/#!2/89b2b/2

我有预订表,ID ObjectID,PeriodStartPeriodEndDATE类型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

4 个答案:

答案 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 |
+----------+

小提琴:http://sqlfiddle.com/#!2/89b2b/90

答案 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';

http://sqlfiddle.com/#!2/89b2b/15