2017-04-13 60 views
2

我有一个问题,我一直在努力,我尝试了几种方法,并不认为我有正确的答案。我试图看看某个月某人是否住在某家酒店。我遇到的问题是,如果他们在那个月之前开始他们的逗留,并且在特定月份之后结束。检查某个月某人是否住在某家旅馆,SQL

我的模式是:

  • 预订(hotelNo,guestNo,dataFrom,dateTo,roomNo)
  • 游客(guestNo,guest虚拟机名称,guestAddress)

SQL查询我有到目前为止是:

SELECT * 
FROM Guest 
WHERE guestNo IN (SELECT guestNo 
        FROM Booking 
        WHERE (dateFrom >= “11/01/16” AND dateTo <= “11/30/16”) 
        OR (dateFrom >= "10/01/16" AND dateTo <= "11/01/16") 
        OR (dateFrom "11/30/16" AND dateTo <= "12/31/16") 

但是我认为这会失败,因为有人不住w空闲时间到十月。有什么建议么?

+3

哪些DBMS您使用的? (这是无效的标准SQL) –

+0

这不是一个特定的DBMS,它只是我试图通过的逻辑。我知道这不是标准的SQL,如果你输入的话,它将会起作用。 –

回答

0

特定月份下跌的开始和结束日期。如果您也想赶上这开始前一个月或延伸到下月使用overlaps运营商停留在简单一点:

select * 
from guests g 
where exists (select * 
       from booking b 
       where (b.datefrom, b.dateto) overlaps (date '2016-11-01', date '2016-11-30') 
       and b.guestno = g.guestno); 
+0

我认为这是最有意义的。由于它处理所有我需要检查的选项。 –

0

这是一个月期间的任何重叠正确的逻辑:

select g.* 
from guests g 
where not exists (select 1 
        from booking b 
        where b.guestno = g.guestno and 
         b.datefrom <= '2016-11-30' and 
         b.dateto >= '2016-11-01' 
       ); 

撑杆与月重叠如果它开始于或月末之前和上或每月的开始之后结束。

+0

我明白除了“select 1”之外的全部语句,它将抓住什么? –

+0

这是一个NOT EXISTS子查询。所选的值无关紧要。我总是用1. –

-1

你可以只从10月1日检查,12月31日

0

您可以检查是否间起始和结束日期

SELECT * 
FROM Booking 
WHERE ('2016-11-01' BETWEEN dateFrom AND dateTo) 
OR ('2016-11-30' BETWEEN dateFrom AND dateTo) 
OR (dateFrom >= '2016-11-01' AND dateTo <= '2016-11-30') 
相关问题