2012-04-17 62 views
1

表名:MRM_BOOKING_DETAILS
樣本數據:SQLite的子查詢不能

Booking_id USER_ID ROOM_ID CHECKIN    CHECKOUT 
1   hary 1  2012-04-16 09:00:00 2012-04-16 09:30:00 
2   jenny 2  2012-04-17 13:00:00 2012-04-17 13:30:00 
3   steve 1  2012-04-16 15:00:00 2012-04-16 15:30:00 

等等...

Booking_id是主鍵。 Room_Id是外鍵w.r.t.作爲PK的Room_Details_Table具有Room_Id

我的目標是獲取特定日期的可用記錄列表,特定時間由用戶輸入。這樣做,我想出了這個查詢:

SELECT ROOMNO,BUILDINGNO 
FROM MRM_ROOM_DETAILS 
WHERE ROOMID IN (SELECT distinct roomid 
       FROM MRM_BOOKING_DETAILS 
       WHERE (CHECKIN NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00') 
        and (CHECKOUT NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00')) 
    AND CAPACITY > 15 AND PROJECTIONSTATUS = 'NO'; 

CapacityProjectionStatus在房間詳細表列,請忽略這部分截至目前。

CHECKINCHECKOUT是用戶在搜索屏幕上提供的值。

但不幸的是,子查詢是不正確的,因此我沒有得到所需的結果。

SELECT distinct roomid 
FROM MRM_BOOKING_DETAILS 
WHERE (CHECKIN NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00') and 
     (CHECKOUT NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00'); 

這就是爲什麼我說子查詢不正確。假設由用戶所提供的值是:

CHECKIN : 2012-04-16 09:00:00 and CHECKOUT: 2012-04-16 09:30:00 

隨着在表中的上述數據,既ROOM_ID 1和2將被返回。對於第一行,它會失敗,但它會成功的第二和第三行,結果它會返回1和2這是不正確的。正確的結果應該只有2.

請幫我找到正確的查詢。

回答

1

將您的邏輯從「x時間以外預訂的房間」更改爲「x時間未預訂的房間」。

另外,您應該使用DATETIME函數。

UPDATE

我添加了檢查所有的路口,和我沒有使用含BETWEEN使房間可以預訂從8:30到9:00和從9:00到9: 30。

SELECT ROOMNO, BUILDINGNO 
FROM MRM_ROOM_DETAILS 
WHERE ROOMID NOT IN (
    SELECT DISTINCT ROOM_ID as ROOMID 
    FROM MRM_BOOKING_DETAILS 
    WHERE (DATETIME(CHECKIN) > DATETIME('2012-04-16 08:30:00') AND DATETIME(CHECKIN) < DATETIME('2012-04-16 09:31:00')) 
     OR (DATETIME(CHECKOUT) > DATETIME('2012-04-16 08:30:00') AND DATETIME(CHECKOUT) < DATETIME('2012-04-16 09:31:00')) 
     OR (DATETIME('2012-04-16 08:30:00') > DATETIME(CHECKIN) AND DATETIME('2012-04-16 08:30:00') < DATETIME(CHECKOUT)) 
     OR (DATETIME('2012-04-16 09:31:00') > DATETIME(CHECKIN) AND DATETIME('2012-04-16 09:31:00') < DATETIME(CHECKOUT)) 
) 
    AND CAPACITY > 15 
    AND PROJECTIONSTATUS = 'NO'; 
1

當日期是字符串時,Sqlite不支持日期比較。爲此,您需要將所有數據庫端日期轉換爲數字。