2011-05-27 9 views
2

私はSQLiteデータベースを使って作業しており、建物、部屋、スケジュールされたイベントを記述する3つのテーブルがあります。SQL - スケジュール内の空白を見つける

テーブルは次のようになります。

  • 建物(ID、名前)
  • 部屋(ID、BuildingID、ナンバー)
  • イベント(ID、BuildingID、RoomID、日、s_time、e_time)

すべてのイベントは建物と部屋に関連付けられています。 Day列には、曜日(Aの値が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は、火曜日にイベントが発生したことを意味し、木曜日は7です)。 3および7の積は21ではありません。私はあなたの方法論に混乱しています。 – stefgosselin

+0

ありがとうございます。 – gjarzab

+1

の近くのdup:http://stackoverflow.com/questions/6018445/get-list-with-start-and-end-values-from-table-of-datetimes –

答えて

0

あなたが素数の積として日付を保存している場合は、剰余(%)演算子は、より便利かもしれません:

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

は月曜日か水曜日のどちらかで発生したイベントを選択します。

私は指摘しなければならないのは、素数の積を保存することは計算上もストレージのコストも高いことです。 2つの累乗(Mon = 1、火= 2、水= 4、木= 8、金= 16、土= 32、日= 64)の合計を保存するほうがずっと簡単です。

現在の実装で可能な最大値は510,510です。そのような数値を格納する最小のデータ型はint(1行につき32ビット)で、エンコードされたデータを取得するには最大7つのモジュロ(%)の操作が必要です。

2^n集計方法の可能な最大値は127であり、これはtinyint(1行につき8ビット)に格納することができ、符号化データを検索するとビット単位で、(&) )。

おそらくあなたが作業している問題ではありませんが、あなたのソリューションがより大きなスケールで実装されるならば、深刻な問題に遭遇しないように、あらゆるスペースやパフォーマンスの効率を提供する方法を選択するのは良い習慣です。

+1

2^nの合計値ははるかに良いのように見えますアイディア。なぜ私は最初にそれを考えなかったのか分かりません。 – gjarzab

+0

あなたの唯一の他の質問はAndroidプログラミングであることに気付きました。AndroidのSQLite実装でこれを実行している場合は、アルゴリズムで可能な限り効率を上げたいと思うでしょう。デバイスによっては、多くの組み込みデバイスに分割操作の実際のハードウェアがないため、モジュロは実際には非常に高価になります。 2^nを使用するほうがはるかに良いので、ビットごとに切り替えることができます。 –

関連する問題