我的默认可用房间(avaroom)是0。我想在选择开始日期和结束日期时检查它是否可用。
我的SQL查询
select *
from roomcalendar
where day between '2016-08-26' and '2016-08-31' and avaroom != 0
结果将是这样的。
我使用此查询
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')
但它只显示了一个结果。
如何使正确的查询通过所有测试?
感谢。
答案 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