SQL检查日期之间是否有空房

时间:2018-02-27 15:34:49

标签: mysql sql database

我有一个问题,提到对数据库的查询。 我有这张桌子:

enter image description here

在另一个窗口中,我有一个带有开始和结束日期输入的表单,我想做一个sql来确认房间23是否在这个日期之间,每天都可用。 我试着用这个sql:

SELECT * FROM this_table 
WHERE room_type_id=23 
AND date="2018-03-06 00:00:00" 
AND date="2018-03-07 00:00:00" 
AND date="2018-03-08 00:00:00" 
AND date="2018-03-09 00:00:00"

此查询无效,因为正在检查是否有任何行包含所有日期。

我的问题是:我怎样才能检查这几天房间是否可用?

6 个答案:

答案 0 :(得分:1)

这将以是或否回答您的特定问题。我不确定它是否有用,因为日期搜索值在硬编码列表中都是特定的。

select coalesce(max('no'), 'yes') as available
from tbl t           
where room_type_id = 23 and
    dt in ("2018-03-06 00:00:00", "2018-03-07 00:00:00", 
           "2018-03-08 00:00:00", "2018-03-09 00:00:00");

如果您的逻辑意图是找到至少一个开放的日期,那么您可以尝试这样的事情:

select case when count(*) = 4 then 1 else 0 end as whatever_this_means
from tbl t
where room_type_id = 23 and
    dt in ("2018-03-06 00:00:00", "2018-03-07 00:00:00", 
           "2018-03-08 00:00:00", "2018-03-09 00:00:00");

问题是您现在已经硬编码了值4,该值与查询中稍后列表中的日期数相关联。有一些方法可以更加动态地处理这个问题,但从你的问题来看,并不完全清楚最好的方法。

答案 1 :(得分:0)

也许在日期之间使用OR代替AND?

SELECT * FROM this_table 
WHERE room_type_id=23 AND 
(date="2018-03-06 00:00:00" OR
date="2018-03-07 00:00:00" OR
date="2018-03-08 00:00:00" OR
date="2018-03-09 00:00:00")

答案 2 :(得分:0)

shawnt00给了我一个好主意。我修改了一点这个查询,更改了是和否响应,它对我有用。

select case when count(*) < 4 then 'no' else 'yes' end as available
from room_type_day t
where room_type_id = 23 and
    date in ("2018-03-07 00:00:00","2018-03-08 00:00:00","2018-03-09 00:00:00","2018-03-10 00:00:00");

答案 3 :(得分:0)

如果你在db中保存房间信息,当有人保留它时,每个记录显示房间在它的日期不是空的,现在如果你有另一个表存储房间名称,你可以选择不存在任何日期的房间< / p>

SELECT room_id FROM rooms WHEN room_id NOT IN (SELECT room_id FROM reserveTable WHERE date BETWEEN @StartDate AND @EndDate)

但如果您在db中存储空房间(可能是脏数据库;-)),您可以选择日期之间的房间,

SELECT room_id FROM reserveTable WHEN date BETWEEN @StartDate AND @ EndDate

最后,它取决于您的数据库结构和表单定义 我希望这能帮助你找到一个好的解决方案

答案 4 :(得分:0)

如果'this_table'存储可用空间,则可以使用此技巧返回0或1:

计算可用天数:

SELECT room_type_id, Count(*) as Av_days
FROM this_table
WHERE room_type_id=23 AND date BETWEEN @StartDate AND @ EndDate GROUP BY room_type_id

然后测试平等:

SELECT (DATEDIFF(@EndDate, @StartDate) = Av_days )
 FROM
  (SELECT room_type_id, Count(*) as Av_days
  FROM this_table
   WHERE room_type_id=23 AND date BETWEEN @StartDate AND @ EndDate
  GROUP BY room_type_id) t

如果您的天数相同,则会返回1,否则为0

答案 5 :(得分:-1)

您需要使用OR代替AND。如果23号房间等于列出的所有4个日期,您的陈述只会返回结果。

SELECT * FROM this_table 
WHERE room_type_id=23 
AND 
(
   date="2018-03-06 00:00:00" 
OR date="2018-03-07 00:00:00" 
OR date="2018-03-08 00:00:00" 
OR date="2018-03-09 00:00:00"
)