如何在开始和结束日期之间检查所有可用房间?

时间:2016-08-26 06:19:12

标签: mysql

我的默认可用房间(avaroom)是0。我想在选择开始日期和结束日期时检查它是否可用。

我的SQL查询

select *
from roomcalendar
where day between '2016-08-26' and '2016-08-31' and avaroom != 0

结果将是这样的。

enter image description here

我使用此查询

select *
from roomcalendar
where day between '2016-08-26' and '2016-08-31' and avaroom != 0  
having count(*) = datediff('2016-08-31', '2016-08-26') 

结果将为空。是真的。因为我在开始和结束日期之间检查所有房间是否可用。

下一个查询我更改为开始日期26和结束日期27

select *
from roomcalendar
where day between '2016-08-26' and '2016-08-27' and avaroom != 0 
having count(*) = datediff('2016-08-27','2016-08-26')

输出将为1行

是的,还是对的。因为26天的房间可用。

我再次检查开始日期26和结束日期28.

select *
from roomcalendar
where day between '2016-08-26' and '2016-08-28' and avaroom != 0
having count(*) = datediff('2016-08-28','2016-08-26')

是的。它仍在工作。我认为它是空的,因为28个房间不可用。也正确。

现在。我试着再次改变。开始日期29和结束日期30

select *
from roomcalendar
where day between '2016-08-29' and '2016-08-30' and avaroom != 0 
having count(*) = datediff('2016-08-30', '2016-08-29')

哎呀!它没有显示结果。我认为29日期房间可用。它会显示1行。对? 那么如何获得正确的查询呢?

再次检查。开始日期29和结束日期31.可能会显示2结果。

select *
from roomcalendar
where day between '2016-08-29' and '2016-08-31' and avaroom != 0 
having count(*) = datediff('2016-08-31','2016-08-29')

但它只显示了一个结果。

如何使正确的查询通过所有测试?

感谢。

2 个答案:

答案 0 :(得分:0)

我知道你要去做什么

你需要一行avaroom>每天每天 0,以便能够预订行程。

尝试:

having count(*) = datediff('start-date','end-date')+1

对于1的约会,我们预计2个可用日期 对于4的约会,我们预计有5天可用

考虑,行程开始2016-09-01并结束2016-09-02 - datediff为1但我们需要avaroom为09-01和09-02,2天意味着2行,所以count(*)应该是约会+ 1。

注意:如果您不需要检查出发日期,那么您将要使用相同的查询,但请确保在结束日期之前搜索结束日期< / em>出发日期。您可以使用mysql DATE_SUB('some-date',INTERVAL 1 DAY)代替出发日期some-date来执行此操作。

祝你好运!

答案 1 :(得分:0)

被遗弃得对,但还有一个问题。 您需要使用一些计数器来填补不存在日期的空白。 此查询将完成此任务。

select *,IF(avaroom != 0,1,0) a from roomcalendar where day between '2016-08-29' and '2016-08-30' GROUP BY a having sum(a) = datediff('2016-08-30','2016-08-29')+1