SQL选择具有可用日期

时间:2015-11-30 17:15:15

标签: php mysql

这实际上是两个人,但是现在可以随意回答第1部分。

Property
==============
ID  |  ... |


Calendar
=============
property_id |  start_date | end_date | block_reason

property表包含有关该属性的所有数据。 calendar表包含因任何原因而被阻止的日期范围。 start_dateend_date之间(包括)的日期被视为已被屏蔽。 propertycalendar表格有一对多的关系。

查询(第1部分)

我想选择一个在给定开始日期和结束日期之间有可用日期的属性。到目前为止,我已经尝试过了。

SELECT * 
FROM property AS p
LEFT JOIN calendar AS c ON c.property_id=p.id
WHERE (c.start_date IS NULL OR c.start_date > "{my start date}") 
  AND (c.end_date IS NULL OR c.end_date < "{my end date}")

如果属性在日历表中没有结果,则此方法有效。但是否则非常失败(空结果集)。

查询(第2部分)

一旦我们得到第1部分工作。用户还可以提供可用的天数,我们需要选择在给定的起始范围内具有连续天数的属性。基本上“我想要一个在X和Y日期之间有N天的房产。”

我整个上午一直在谷歌搜索,我的朋友/同事似乎都没有想法从哪里开始。因为结果是分页的,所以我想避免在PHP中处理这个并且不得不做整个选择,过滤,重复直到没有结果或整页,逻辑shindig。

我很感激帮助。感谢。

修改

根据请求,虚拟数据的小提琴。 http://sqlfiddle.com/#!9/854eb/7

1 个答案:

答案 0 :(得分:2)

这个想法是计算两者之间的天数,然后将其与天数进行比较。假设没有重叠,结束日期是包容性的:

SELECT c.property_id
FROM calendar c
WHERE c.start_date <= {my end date} AND
      c.end_date >= {my start date}
GROUP BY c.property_id
HAVING SUM(datediff(greatest({my start date}, c.start_date),
                    least({my end date}, c.end_date)
                   ) + 1
          ) < datediff({my end date} , {my start date}) + 1