问题描述
|
我正在使用SQLite数据库,并且有三个表描述建筑物,房间和预定事件。
这些表如下所示:
建筑物(ID,名称)
客房(ID,建筑物ID,编号)
事件(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;
在这里,我找到了特定建筑物的所有房间,然后删除了当前正在进行中的预定活动的房间。
我期待所有有用的提示/意见。
解决方法
如果将日期存储为素数的乘积,则模(%)运算符可能更有用:
SELECT * FROM Events
INNER JOIN Buildings on (Events.BuildingID = Buildings.ID)
WHERE
(Events.Days % 2 = 0 AND Events.Days % 5 = 0)
将选择在星期一或星期三发生的事件。
我确实必须指出,存储素数的乘积既计算又存储昂贵。存储2的幂的和容易得多(星期一= 1,星期二= 2,星期三= 4,星期四= 8,星期五= 16,星期六= 32,星期日= 64)。
当前实施的最大可能价值是510,510。存储此类数字的最小数据类型是int(每行32位),而检索编码数据最多需要7个模(%)运算。
2 ^ n求和方法的最大可能值为127,可以将其存储在tinyint中(每行8位),而检索编码数据将使用按位和(&),后者稍微便宜一些(因此更快)。
对于您正在使用的解决方案来说,这可能不是问题,但是这是一个好习惯,即选择能够为您提供最佳空间和性能效率的任何方法,以免在大规模实施解决方案时遇到严重问题。