2017-04-13 102 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') 
相關問題