SQL-在计划中查找开放空间

问题描述

| 我正在使用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位),而检索编码数据将使用按位和(&),后者稍微便宜一些(因此更快)。 对于您正在使用的解决方案来说,这可能不是问题,但是这是一个好习惯,即选择能够为您提供最佳空间和性能效率的任何方法,以免在大规模实施解决方案时遇到严重问题。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...