【问题标题】:booking dates ranges mysql php预订日期范围 mysql php
【发布时间】:2014-10-26 16:55:34
【问题描述】:

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

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

我有预订表,在MySQL 中有IDObjectIDPeriodStartPeriodEnd 类型的字段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';):

$from = '2014-08-15';
$to = '2014-08-19'

我想获得在查询日期间隔内免费ObjectIDs。
问题是,对象的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

【问题讨论】:

  • WHERE PeriodStart <= '2014-08-19' AND PeriodEnd >= '2014-08-14' :我误解了你的问题还是你把 periodStart 和 periodEnd 颠倒了?
  • 为什么2 会出现在结果中?
  • @GordonLinoff 好点。我的错。 :(

标签: mysql sql date date-range


【解决方案1】:

完整代码为:

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

【讨论】:

  • 感谢@GordonLinoff 他发现了错误。如果对象 2 在 8 月 13 日至 15 日的数据库预订中有您的查询如何正确回答?我已经编辑了问题并更改了查询周期。
  • 你想要 13 到 15 还是 15 到 19?
  • 我希望在任何输入的时间间隔上都得到正确的结果。对于查询14-19 aug必须只有一个结果3,对于查询15-19 aug必须是两个结果[2, 3]
  • 您的数据现在令人困惑......它有两行具有相同的值。对象 ID 具有不同的开始日期和结束日期。 :/
  • 请详细解释。对象3 已有 2 个预订。对象2 也有 2 个预订。什么相同的值?
【解决方案2】:
SELECT DISTINCT ObjectID
  FROM booking
 WHERE PeriodStart <= '2014-08-19' 
   AND PeriodEnd >= '2014-08-14';

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

【讨论】:

  • 感谢您的回答,但您的查询提供的数据返回错误的结果。我们为对象2 预订了从@9​​87654324@ 到15 aug 的时间段。请查看更新后的问题。
  • 这不返回 2 和 3?现在我很困惑。也许你需要一个更合适的代表性数据集和期望的结果集。
【解决方案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

这会计算包含您关心的的预订的次数。如果有,则过滤掉该对象。

【讨论】:

  • 是否有理由对似乎有效的逻辑投反对票? (sqlfiddle.com/#!2/89b2b/14)
  • 我认为您的查询很好,或者我真的不明白 op 想要什么。他说他想要结果中的对象 2、3,但对象 2 在 2014 年 8 月 14 日有预订所以..
  • @Logar 谢谢。我的错。我只想查询日期14-19 aug ObjectID 3,查询15-19 aug[2, 3]。我已经更新了这个问题。抱歉弄错了:(
【解决方案4】:

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

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

【讨论】:

  • 哦,对不起,senk - 忽略了你的答案 - 但请注意 DISTINCT 不是函数!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多