【问题标题】:SQL - Finding open spaces in a scheduleSQL - 在计划中查找开放空间
【发布时间】:2011-05-27 15:46:13
【问题描述】:

我正在使用 SQLite 数据库,我有三个表来描述建筑物、房间和预定活动。

表格如下所示:

  • 建筑物(ID、名称)
  • 房间(ID,BuildingID,Number)
  • 事件(ID,BuildingID,RoomID,Days,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;

我在此处找到特定建筑物的所有房间,然后删除当前正在进行预定活动的房间。

我期待所有有用的提示/cmets。

【问题讨论】:

  • >Days 列包含一个整数,它是对应于星期几的素数的乘积(值 23 表示事件发生在星期二 = 3 和星期四 = 7)。 3和7的乘积不是21吗?我对你的方法感到困惑。
  • 是的,感谢您了解这一点。

标签: sql sqlite gaps-and-islands


【解决方案1】:

如果您将日期存储为质数的乘积,则模 (%) 运算符可能更有用:

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 位)中,检索编码数据将使用按位和 (&),这更便宜(因此更快) .

对于您正在使用的东西来说可能不是问题,但最好选择任何可以为您提供最佳空间和性能效率的方法,以免在您的解决方案在更大范围内实施时遇到严重问题。

【讨论】:

  • 对 2^n 的值求和似乎是一个更好的主意。我不知道为什么我一开始就没有想到它。
  • 是的,刚刚注意到您唯一的另一个问题是关于 Android 编程。如果你在 Android 的 SQLite 实现上运行它,你会希望你的算法有尽可能高的效率。根据设备的不同,取模实际上可能非常昂贵,因为许多嵌入式设备没有用于除法运算的实际硬件。使用 2^n 更好,因此您可以切换到按位与。
猜你喜欢
  • 1970-01-01
  • 2021-04-01
  • 2015-04-23
  • 1970-01-01
  • 2010-11-11
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
相关资源
最近更新 更多