2011-05-27 50 views
2

我正在使用SQLite數據庫,並且有三個表格來描述建築物,房間和計劃事件。SQL - 查找計劃中的開放空間

的表是這樣的:

  • 建築物(ID,姓名)
  • 房間(ID,BuildingID,號碼)
  • 事件(ID,BuildingID,RoomID,天,S_TIME,e_time)

因此,每個事件都與建築物和房間相關聯。列Days包含一個整數,它是與一週中的天數對應的素數的乘積(值爲21表示事件發生在星期二= 3和星期四= 7)。

我希望能夠找到一種方法來生成特定建築物中的房間報告,該建築物將在未來幾個小時內開放,以及這些房屋將會開放多久。

這是我到目前爲止有:

SELECT Rooms.Number 
FROM Rooms 
INNER JOIN Buildings on (Rooms.BuildingID = Buildings.ID) 
WHERE 
    Buildings.Name = "BuildingName" 

EXCEPT 

SELECT Events.RoomID 
FROM Events 
INNER JOIN Buildings on (Events.BuildingID = Buildings.ID) 
WHERE 
    Buildings.Name = "BuildingName" AND 
    Events.days & 11 = 0 AND 
    time("now", "localtime" BETWEEN events.s_time AND events.e_time; 

我在這裏找到所有客房特定建築物,然後我取出室,目前已在進展調度的事件。

我期待着所有有用的提示/評論。

+0

>列Days包含一個整數,它是與一週中的天數相對應的素數的乘積(值23表示事件發生在星期二= 3和星期四= 7)。 是不是3和7的乘積是21?我對你的方法感到困惑。 – stefgosselin 2011-05-27 15:50:03

+0

是的感謝捕捉。 – gjarzab 2011-05-27 15:52:11

+1

近似dup:http://stackoverflow.com/questions/6018445/get-list-with-start-and-end-values-from-table-of-datetimes – 2011-05-27 16:24:06

回答

0

如果你存儲日期爲素數的乘積,模(%)運算符可能更爲有用:

SELECT * FROM Events 
INNER JOIN Buildings on (Events.BuildingID = Buildings.ID) 
WHERE 
    (Events.Days % 2 = 0 AND Events.Days % 5 = 0) 

會選擇事件發生在任何一個週一或週三。

但我必須指出,存儲素數的產品既是計算上的又是存儲昂貴的。更容易存儲兩個冪的和(星期一= 1,星期二= 2,星期三= 4,星期四= 8,星期五= 16,星期六= 32,星期日= 64)。

您當前實施的最大可能值爲510,510。存儲這樣一個數字的最小數據類型是int(每行32位),檢索編碼數據需要多達7個模(%)操作。

對於2^n的求和方法的最大可能值是127,其可以存儲在一個TINYINT(每行8位)和檢索的編碼數據將使用按位與(&)這是有點更便宜(和因此更快)。

可能不是您正在處理的內容的問題,但選擇任何方法可爲您提供最佳空間和性能效率是一種好習慣,以免在較大規模實施解決方案時遇到嚴重問題。

+1

總結2^n的值看起來像一個好得多理念。我不確定爲什麼我沒有首先想到它。 – gjarzab 2011-08-16 12:43:26

+0

是的,剛剛發現你唯一的問題就是Android編程。如果你在Android的SQLite實現上運行這個功能,你會在算法中儘可能地提高效率。取決於器件,模數實際上可能非常昂貴,因爲許多嵌入式器件沒有用於除法操作的實際硬件。使用2^n更好,所以你可以切換到按位和。 – 2011-08-17 17:39:34