我有一个问题,提到对数据库的查询。 我有这张桌子:
在另一个窗口中,我有一个带有开始和结束日期输入的表单,我想做一个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"
此查询无效,因为正在检查是否有任何行包含所有日期。
我的问题是:我怎样才能检查这几天房间是否可用?
答案 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"
)